繁体   English   中英

对未定义的类使用isinstance

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM