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