如何在Python中强制执行组合类型提示?

问题描述 投票:0回答:1

有没有办法在 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:
时,代码运行时没有任何错误。

我已经看到了相关问题这里这里,但它们并没有让我更接近。

python python-typing
1个回答
0
投票

我认为您可以添加一个条件,以检查通过列表提供的元素,如果其中任何一个不是您想要的

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

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.