[英]Use isinstance with an undefined class
假定有时(但并非总是)定义了MyClass
类。 我有一个函数foo(a=None)
,其中参数a
可以是None
,字符串或MyClass
的对象。
我的问题是:如果在我的Python会话中未定义MyClass
,如何以类似于isinstance
的方式检查参数a
的类型,而不会出现NameError
?
关于鸭子类型的注意事项:我故意限制该功能。
我正在使用Python 2.6.x,并且不能选择更新。 前向兼容的解决方案(尤其是2.7.x版)受到高度赞赏。
如果未定义MyClass
则无法引用其类型。
因此,您将无法验证type(a)
具有正确的值。
我会建议使用另一种方法:填充类,以便所有想要引用它的代码都可以这样做:
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
的方法而不执行任何操作( pass
)来解决该问题。 之后,我不再需要检查其类型。
对于不同的情况,可能存在不同的解决方法。 捕获NameError可能是另一个。
t = 'asdfas'
print(isinstance(t, str))
try:
print(isinstance(t, MyClass))
except NameError:
print(False)
在我看来,这样的构造可能会出现在未来的python中。 就像输入python一样,这是很新的。 在键入的python中,我们有可能在apos中使用将来的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.