Python 对未定义的类使用isinstance

Python 对未定义的类使用isinstance,python,isinstance,Python,Isinstance,假设classMyClass有时定义,但并不总是定义。我有一个函数foo(a=None),其中参数a可以是None、字符串或MyClass的对象 我的问题是:如果我的Python会话中没有定义MyClass,我如何以类似于isinstance的方式检查参数a的类型,而不得到NameError 关于duck类型的注意:我故意限制了这个函数 我使用的是Python2.6.x,更新不是一个选项。非常感谢向前兼容的解决方案(尤其是2.7.x版)。如果未定义MyClass,则无法引用其类型 因此,您无法验

假设class
MyClass
有时定义,但并不总是定义。我有一个函数
foo(a=None)
,其中参数
a
可以是
None
、字符串或
MyClass
的对象

我的问题是:如果我的Python会话中没有定义
MyClass
,我如何以类似于
isinstance
的方式检查参数
a
的类型,而不得到
NameError

关于duck类型的注意:我故意限制了这个函数


我使用的是Python2.6.x,更新不是一个选项。非常感谢向前兼容的解决方案(尤其是2.7.x版)。如果未定义MyClass,则无法引用其类型


因此,您无法验证
类型(a)
是否具有正确的值。

我建议使用另一种方法:对类进行多边形填充,以便所有想要引用它的代码都可以这样做:

try:
    from foo import Bar  # load the native class
except ImportError:
    class Bar:
        pass  # implement necessary parts here
您可以将其放入自己的模块中,然后从mymodule导入栏
将其放入所需的任何位置。这允许所有代码都使用
Bar
,而不管它是否是本机定义的


即使重新定义类不是处理此问题的首选方法,但处理
ImportError
仍然是处理此情况的方法,因为您必须以任何一种方式导入类,而这正是发生错误的地方。与其定义类,不如设置一个
class\u exists=False
标志或其他什么。

我通过覆盖
MyClass
中的方法并在其中不做任何操作(
pass
)来解决问题。此后,我不再需要检查它的类型

对于不同的情况,可能存在不同的解决办法捕获名称错误可能是另一个错误

t = 'asdfas'
print(isinstance(t, str))
try:
    print(isinstance(t, MyClass))
except NameError:
    print(False)

在我看来,这样的构造可能会出现在未来的python中。类似于类型化python,这是非常新的。在类型化python中,我们有可能在apos中使用未来的类型。

很简单,如果没有定义它,就会出现
NameError
。没办法,为什么你的类会被有条件地定义?!使用
尝试除此之外的操作
。如果您的类没有定义,那么就没有对象是它的实例。
try except
可能是最好的建议。您还可以检查
a
是否不是
MyClass
isinstance(a,(str,type(None)))
。这样定义类是否更有意义,但它在不同环境中的行为是否不同?这是OOP的一个基本概念。我已经修改了你的答案。如果
class\u exists=False
(class\u exists和isinstance(a,MyClass))
不会因短路而引发错误。