有没有办法在 python 中强制执行组合类型提示?我希望得到以下行为:
import type_enforced
@type_enforced.Enforcer
def my_fn(a: list[int]) -> None:
pass
my_fn(a=[1, 2]) # This should work
my_fn(a=[1, '2']) # This should raise an exception
请注意,问题出在
list[int]
。当我只使用 def my_fn(a: list) -> None:
时,代码运行时没有任何错误。
我认为您可以添加一个条件,以检查通过列表提供的元素,如果其中任何一个不是您想要的
type()
,则函数raise
会出错。像这样:
# we define the function my_func
def my_func(a:list) -> None:
# then we cast the type() using map() and lambda
list_types = list(dict.fromkeys(list(map(lambda x: type(x).__name__, a))))
# we can now check if the list has more than one item (type)
if len(list_types) > 1: raise TypeError
# else we should run the below code
print(a)
如果我们那么:
>>> my_func([1,2,3])
>>> [1, 3, 5]
或者我们投射一个包含多种类型的列表:
>>> my_func([1,'a',3])
>>> TypeError
它为列表中的每个元素投射
map()
,然后我们使用list(dict.fromkeys(list_check))
来删除重复项,我们评估是否有多个公民,这意味着不止一种类型,在这种情况下我们应该raise:TypeError
。
可能不是最优雅的方式,但它有效,不确定这是否足够。另外,可能值得检查一下为什么您的代码需要这些强类型行,因为 Python 是动态类型的,您可以阅读一些概念,例如 Duck Typing。
这里还有上面代码的one-liner:
if len(list(dict.fromkeys(list(map(lambda x: type(x).__name__, a))))) > 1:raise TypeError
希望这有帮助!