繁体   English   中英

鸭的打字和使用hasattr

[英]Duck typing and use of hasattr

我已经看过很多次了:

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

    # Parse the text here...

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

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

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

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

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

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

pythonic方法是假定text是任何合适的类型 仅当您知道 text在不同时间将完全不同时,才使用try-except / hasattr

换句话说, 不要验证 仅使用if你要去else ,并try如果你真的想在特殊处理except

pythonic方式根本检查对象的类型。 一种语言很复杂,以至于您很难确保不包含任何以后会失败的对象(您的帖子中的明显示例:您无需检查函数是否接受0参数,甚至不用考虑返回类型),并且-更糟糕的是-您很容易错误地排除有效代码。

最好只是假设输入值可以,然后在发现输入值不正确的情况下失败。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM