gpt4 book ai didi

python - duck-typing 失败时诊断错误

转载 作者:行者123 更新时间:2023-11-28 18:44:38 27 4
gpt4 key购买 nike

我有一个使用参数元组创建类实例的“工厂”:

def factory(cls, arg):
return cls(*arg)

class Foo(object):
def __init__(self, a, b):
pass

a = (1,2)
f = factory(Foo, a)

这很好用,所以我决定(出于超出此问题范围的各种原因)添加对不接受任何参数的类的支持作为后备,以便可以在现有代码中更广泛地使用它。所以我需要检测 2-arg 与 0-arg 构造函数的可用性并适本地回退。鸭子类型(duck typing)似乎是“Pythonic”的答案,而且效果很好:

def factory(cls, arg):
try:
return cls(*arg)
except TypeError:
print("Missing 2-arg, falling back to 0-arg ctor")
return cls()

class Foo(object):
def __init__(self,a,b):
pass

class Bar(object):
def __init__(self,a):
pass

a = (1,2)
f = factory(Foo, a)
b = factory(Bar, a)

然而,当其中一个 __init__ 函数出现错误时,问题就来了。当 0-arg 和 2-arg __init__ 都不存在时,我试图提供帮助并发出警告:

def factory(cls, arg):
try:
return cls(*arg)
except TypeError:
print("%s Missing 2-arg, falling back to 0-arg ctor" % str(cls))
return cls()

class Foo(object):
def __init__(self,a,b):
iter(a) # Oops, TypeError

a = (1,2)
try:
f = factory(Foo, a)
except TypeError: # 0-arg must be missing too
print("Neither 2-arg nor 0-arg ctor exist, that's all we support, sorry")

但是这里有一个致命的缺陷 - 我无法区分因为不存在合适的 __init__ 而引发的 TypeErrorTypeError这是由于 __init__ 中更深层的问题而引发的。

我不是在寻找修复 FooBar 的方法,而是在“工厂”或其调用者级别更精确地理解失败的方法。

我如何以编程方式判断 TypeError 是没有重载匹配的结果,还是其他地方的失败?我现在最好的想法是以编程方式遍历堆栈跟踪并查看行号,这充其量是可怕的。

最佳答案

测试 __init__ 方法所需的参数数量可以让您区分两种失败模式。

class Foo(object):
def __init__(self,a,b):
pass

class Bar(object):
def __init__(self,a):
pass

class Baz(object):
def __init__(self):
pass

def ctr_arg_count(cls):
fn = getattr(cls, '__init__')
return len(inspect.getargspec(fn).args) - 1

def factory(cls, *args):
if len(args) != ctr_arg_count(cls):
print("Can't initialize %s - wrong number of arguments" % cls)
return None
return cls(*args)

print factory(Foo, 1, 2)
print factory(Bar, 1)
print factory(Baz)
print factory(Foo, 1)

>>> <__main__.Foo object at 0x100483d10>
<__main__.Bar object at 0x100483d10>
<__main__.Baz object at 0x100483d10>
Can't initialize <class '__main__.Foo'> - wrong number of arguments
None

关于python - duck-typing 失败时诊断错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21960914/

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