我有一个简单的类,可以在各种基类上运行(字符串,列表,文件......在Python3.x中传递给它并返回相同的类型。现在,我正在使用isinstance
对于类型检查虽然已经阅读了这样做的所有警告。
我的问题是写这个函数的pythonic方法是什么。 '鸭子打字'似乎更适合测试使用正确的类型。我考虑通过传递类型[func(type, input)]
或测试hasattr
进行重载。我希望代码与最佳实践保持一致,未来友好且可由我自己以外的程序员升级。
答案 0 :(得分:2)
您应该检查对象的行为,而不是检查对象的实际类型。
我的意思是,而不是
isinstance(foo, str) or isinstance(foo, list) or ...
您对它是否是序列更感兴趣,这意味着它已定义__iter__
例如
hasattr(foo, '__iter__')
从这个意义上讲,你并不关心对象本身是什么,而只是想让对象以某种方式行事。
同样,如果你想让对象成为"可索引的"你可以检查
hasattr(foo, '__getitem__')
你可以按照这种模式强制执行你的打字"鸭子打字"设计。