假设有时(但不总是)定义类MyClass
。我有一个函数foo(a=None)
,其中参数a
可以是None
,字符串或MyClass
的对象。
我的问题是:如果我的Python会话中没有定义MyClass
,我怎么能以类似于a
的方式检查参数isinstance
的类型而不会得到{{1} }}?
关于鸭子打字的注意事项:我故意限制功能。
我正在使用Python 2.6.x并且不能选择更新。前瞻性解决方案(尤其是2.7.x)非常受欢迎。
答案 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中使用将来的类型。