Mic*_*ray 11 python metaprogramming type-hinting python-3.7
我正在尝试在 python 中使用通用类型提示,但是我不确定我想要的行为是否可能。我已经阅读了很多类型提示文档,但找不到我要找的内容。
如果未定义类型,我希望能够使用默认类型指定类类型参数。例如,我想象代码看起来像这样。
T = TypeVar('T')
S = TypeVar('S')
class Attribute(Generic[T, S=int]):
...
class FooBar:
a: Attribute[str, str]
b: Attribute[str]
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,如果未在类型提示中指定,类型 S 将默认为 int。我也对使用元编程来实现这一点的解决方案感到满意。
泛型类型背后的整个想法源于静态类型语言(例如 Scala 或 Java),它是在定义代码时允许类型的灵活性,并防止函数不必要的过度重载(这在作为动态类型的 Python 中不需要)语言)。因此,定义默认或后备类型完全偏离了泛型的概念。话虽如此,我认为联盟[]更适合回答你的问题。
如果您想将其与泛型类型结合起来(考虑到泛型背后的逻辑,这没有多大意义),您可以执行以下操作:
from typing import Union, TypeVar
T = TypeVar('T')
def foo(var: Union[T, str]):
if var:
return "boo"
res = foo("bar")
print(res)
Run Code Online (Sandbox Code Playgroud)
但是,我建议在定义代码时,尽可能具体和严格地考虑类型,并定义更好的泛型。这可以通过定义更严格的泛型/抽象类型来实现:
T = TypeVar('T') # Can be anything
A = TypeVar('A', str, bytes) # Must be str or bytes
Run Code Online (Sandbox Code Playgroud)
后者将允许您保持通用性,并且对类型有更多的控制。
| 归档时间: |
|
| 查看次数: |
4609 次 |
| 最近记录: |