我通常希望我的代码尽可能通用。我目前正在编写一个简单的库,这次能够在我的库中使用不同的类型感觉特别重要。
一种方法是强迫人们继承一个“接口”类。对我来说,这感觉更像是 Java 而不是 Python,并且issubclass
在每种方法中使用听起来也不是很诱人。
我的首选方式是善意使用该对象,但这会引发一些AttributeErrors
. 我可以将每个危险的调用包装在一个 try/except 块中。这也似乎有点麻烦:
def foo(obj):
...
# it should be able to sleep
try:
obj.sleep()
except AttributeError:
# handle error
...
# it should be able to wag it's tail
try:
obj.wag_tail()
except AttributeError:
# handle this error as well
我是否应该跳过错误处理并期望人们只使用具有所需方法的对象?如果我做了一些愚蠢的事情,比如[x**2 for x in 1234]
我实际上得到的是 aTypeError
而不是 a AttributeError
(整数不可迭代),那么某处必须进行一些类型检查——如果我想做同样的事情怎么办?
这个问题有点开放式,但是以干净的方式处理上述问题的最佳方法是什么?是否有任何既定的最佳实践?例如,上面的可迭代“类型检查”是如何实现的?
编辑
虽然AttributeError
s 很好,但TypeErrors
本机函数引发的通常会提供有关如何解决错误的更多信息。以此为例:
>>> ['a', 1].sort()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()
我希望我的图书馆尽可能有用。