1

我见过很多次这样的事情:

def parse(text):
    if hasattr(text, 'read'):
        text = text.read()

    # Parse the text here...

但是如果我传递以下类的实例,它肯定会失败:

class X(object):
    def __init__(self):
        self.read = 10

我的问题是:最pythonic的处理方式是什么?

我一直在考虑两种主要方法:

if hasattr(text, 'read') and callable(text.read):
    text = text.read()

try:
    text = text.read()
except ...
4

2 回答 2

4

pythonic 的方式是假设text任何类型都是合适的。仅在您知道在不同时间将是完全不同的事情时才使用try-except/hasattrtext

换句话说,不要验证. 仅在您打算使用时使用ifelse并且try如果您真的想要在 中进行特殊处理except

于 2013-03-14T04:53:36.343 回答
2

pythonic 方式根本检查对象的类型。一方面,该语言足够复杂,以至于您很难确保不包含任何以后无论如何都会失败的对象(您帖子中的明显示例:您不检查函数是否接受 0 个参数,甚至不想想返回类型),而且——更糟糕的是——你很容易错误地排除有效代码。

最好只假设输入值是好的,如果结果不是,稍后会失败。

实际上只有一个例外:假设您对不同类型(例如字符串/列表)有不同的代码路径,在这种情况下,您必须检查类型以决定采用哪条路径。但同样:尝试最适合您的通用检查(即不要检查isinstance(l, list)是否isinstance(l, collections.Iterable)也可以完成这项工作)。如果后来发现“字符串”不够严格,那么你总是会失败。

于 2013-03-14T05:16:03.753 回答