[英]How to express hasattr() duck typing logic with structural pattern matching?
[英]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.