我最近发现了 typehints 并一直试图将它们包含在我的代码中。但是,当我在类的函数中使用它们时,我收到了 TypeErrors。
这是代表我面临的问题的代码片段:
class MyClass1:
def __init__(self, ID: str) -> None:
# Some code
pass
# More code follows
class MyClass2:
def __init__(self, variables: 'MyClass1' | list['MyClass1']) -> None:
self.variables: list['MyClass1'] = to_list(variables)
# More code follows
我在
def __init__(self, variables: 'MyClass1' | list['MyClass1']) -> None:
行抛出错误“TypeError: unsupported operand type(s) for |: 'str' and 'types.GenericAlias'”。
这是输入提示用户定义类的错误方法吗?不确定我在这里做错了什么,但显然 Python 认为我正在尝试比较字符串和列表,而不仅仅是编写类型提示。
我使用的是Python 3.11.5版本以供参考。
tl;dr:我尝试使用用户定义类的类型提示和联合“|”符号并抛出 TypeError。
如果已经定义了类型提示,则无需将其包装在字符串中:
class MyClass2:
def __init__(self, variables: MyClass1 | list[MyClass1]) -> None:
self.variables: list[MyClass1] = to_list(variables)
如果存在循环引用或类似的情况,这意味着您不能这样做,您也可以将整个内容用引号引起来:
class MyClass2:
def __init__(self, variables: 'MyClass1 | list[MyClass1]') -> None:
self.variables: list[MyClass1] = to_list(variables)
请注意,与函数注释或类注释不同,变量注释不需要包装在字符串中,因为它们永远不会被求值,并且无论如何都无法在运行时访问。