0

假设类MyClass有时(但并非总是)已定义。我有一个函数foo(a=None),其中参数a可以是None、字符串或MyClass.

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

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

我正在使用 Python 2.6.x 并且更新不是一个选项。前向兼容的解决方案(尤其是 2.7.x)受到高度赞赏。

4

3 回答 3

1

我会建议一种不同的方法:填充类,以便所有想要引用它的代码都可以简单地这样做:

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您可能希望设置一个标志或其他东西,而不是定义类。

于 2017-01-17T12:57:46.287 回答
1

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

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

于 2017-01-17T12:42:50.750 回答
1

我通过重写一个方法并在MyClass其中什么都不做(pass)解决了这个问题。之后我不再需要检查它的类型。

对于不同的情况,可能存在不同的解决方法。捕获 NameError可能是另一个问题。

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

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

于 2018-12-08T18:04:07.017 回答