使用isinstance与未定义的类

时间:2017-01-17 12:23:05

标签: python isinstance

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

我的问题是:如果我的Python会话中没有定义MyClass,我怎么能以类似于a的方式检查参数isinstance的类型而不会得到{{1} }}?

关于鸭子打字的注意事项:我故意限制功能。

我正在使用Python 2.6.x并且不能选择更新。前瞻性解决方案(尤其是2.7.x)非常受欢迎。

3 个答案:

答案 0 :(得分:1)

如果MyClass未定义,则您无法引用其类型。

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

答案 1 :(得分:1)

我建议采用不同的方法:对类进行polyfill,以便所有想要引用它的代码都可以这样做:

list_of_labels = os.listdir(path_to_dir_with_label_dirs)
for label in list_of_labels:
    current_label_dir_path = os.path.join(path_to_dir_with_label_dirs, label
    list_of_images = os.listdir(current_label_dir_path)
    for image in list_of_images:
        current_image_path = os.path.join(current_label_dir_path, image)
        image = open(current_image_path) # use the function which you want.

您可以将其放入您自己的模块中,然后在需要的任何地方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标志或其他内容,而不是定义类。

答案 2 :(得分:1)

我通过在MyClass覆盖方法而不执行任何操作(pass)来解决该问题。之后,我不再需要检查其类型。

在不同情况下,可能存在不同的解决方法。 捕获到NameError 可能是另一个错误。

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

在我看来,这样的构造可能会出现在未来的python中。就像输入python一样,这是很新的。在键入的python中,我们有可能在apos中使用将来的类型。