将 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.

中使用未来的类型