假设类MyClass
有时(但并非总是)已定义。我有一个函数foo(a=None)
,其中参数a
可以是None
、字符串或MyClass
.
我的问题是:如果MyClass
没有在我的 Python 会话中定义,我如何a
以类似于isinstance
没有的方式检查参数的类型NameError
?
关于鸭子打字的注意事项:我故意限制功能。
我正在使用 Python 2.6.x 并且更新不是一个选项。前向兼容的解决方案(尤其是 2.7.x)受到高度赞赏。
假设类MyClass
有时(但并非总是)已定义。我有一个函数foo(a=None)
,其中参数a
可以是None
、字符串或MyClass
.
我的问题是:如果MyClass
没有在我的 Python 会话中定义,我如何a
以类似于isinstance
没有的方式检查参数的类型NameError
?
关于鸭子打字的注意事项:我故意限制功能。
我正在使用 Python 2.6.x 并且更新不是一个选项。前向兼容的解决方案(尤其是 2.7.x)受到高度赞赏。
我会建议一种不同的方法:填充类,以便所有想要引用它的代码都可以简单地这样做:
try:
from foo import Bar # load the native class
except ImportError:
class Bar:
pass # implement necessary parts here
你可以把它放到你自己的模块中,然后from mymodule import Bar
在任何需要的地方。这允许您使用所有代码,Bar
无论它是否是本机定义的。
即使重新定义类不是您处理这种情况的首选方式,处理ImportError
仍然是处理这种情况的方法,因为import
无论哪种方式您都必须使用类,而这就是发生错误的地方。class_exists = False
您可能希望设置一个标志或其他东西,而不是定义类。
如果MyClass
未定义,则您无法引用其类型。
因此,您无法验证是否type(a)
具有正确的值。
我通过重写一个方法并在MyClass
其中什么都不做(pass
)解决了这个问题。之后我不再需要检查它的类型。
对于不同的情况,可能存在不同的解决方法。捕获 NameError可能是另一个问题。
t = 'asdfas'
print(isinstance(t, str))
try:
print(isinstance(t, MyClass))
except NameError:
print(False)
在我看来,这样的构造可能会出现在未来的 python 中。就像键入的python,这是相当新的。在类型化的 python 中,我们有可能在 apos 中使用未来的类型。