我正在创建一个名为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块。例如,您可以这样做:
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块似乎是在间接地达到相同的目的。其次,如果错误不能像这样干净地映射怎么办?(例如,如果传递列表或字典会引发TypeError)。
编辑:我不太喜欢在这里使用try/except方法的第三个原因是我需要去找出Foo在这些情况下会抛出什么异常,而不能事先编码。