gpt4 book ai didi

python - 如何避免对 Python 函数的参数进行类型检查

转载 作者:太空狗 更新时间:2023-10-30 02:30:46 24 4
gpt4 key购买 nike

我正在创建类 Foo 的实例,我希望能够以通用方式从各种类型实例化这些实例。您不能向 Foo 传递字典或列表。请注意,Foo 来自第三方代码库 - 我无法更改 Foo 的代码。

我知道 Python 中的类型检查函数参数被认为是错误的形式。是否有更 Pythonic 的方式来编写下面的函数(即没有类型检查)?

def to_foo(arg):
if isinstance(arg, dict):
return dict([(key,to_foo(val)) for key,val in arg.items()])
elif isinstance(arg, list):
return [to_foo(i) for i in arg]
else:
return Foo(arg)

编辑:可以使用 try/except block 。例如,您可以这样做:

def to_foo(arg):
try:
return Foo(arg)
except ItWasADictError:
return dict([(key,to_foo(val)) for key,val in arg.items()])
except ItWasAListError:
return [to_foo(i) for i in arg]

我对此并不完全满意,原因有二:首先,类型检查似乎更直接地解决了所需的功能,而这里的 try/except block 似乎到达了同一个地方,但不那么直接。其次,如果错误没有像这样清晰地映射怎么办? (例如,如果传递列表或字典会抛出 TypeError)

编辑:我不太喜欢这里的 try/except 方法的第三个原因是我需要去寻找在这些情况下 Foo 将抛出哪些异常,而不是能够预先编写代码。

最佳答案

如果您使用的是 python 3.4,则可以使用 functools.singledispatch , 或 a backport for a different python version

from functools import singledispatch

@singledispatch
def to_foo(arg):
return Foo(arg)

@to_foo.register(list)
def to_foo_list(arg):
return [Foo(i) for i in arg]

@to_foo.register(dict)
def to_foo_dict(arg):
return {key: Foo(val) for key, val in arg.items()}

这是 python 的一个相当新的结构,但在其他语言中是一种常见的模式。我不确定您是否会称其为 pythonic,但它确实感觉比在各处编写 isinstances 更好。尽管在实践中,singledispatch 可能只是在内部为您执行 isinstance 检查。

关于python - 如何避免对 Python 函数的参数进行类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25173324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com