我发现使用isinstance()并不被认为是巨蟒式的,人们建议使用hasattr()。
我想知道记录使用hasattr()的函数的正确用法的最好方法是什么。
例如:我从不同的网站(例如雅虎财经,谷歌财经)获得股票数据,并且有GoogleFinanceData和YahooFinanceData类,它们都有一个方法get_stock(date)。还有一个函数可以比较两只股票的价值:
def compare_stocks(stock1,stock2,date):
if hasattr(stock1,'get_stock') and hasattr(stock2,'get_stock'):
if stock1.get_stock(date) < stock2.get_stock(date):
print "stock1 < stock2"
else:
print "stock1 > stock2"该函数的用法如下:
compare_stocks(GoogleFinanceData('Microsoft'),YahooFinanceData('Apple'),'2012-03-14')它不是这样使用的:
compare_stocks('Tree',123,'bla')问题是:我如何让人们知道他们可以为stock1和stock2使用哪些类?我是不是应该写一个像"stock1 and stock2 ought to have a method get_stock"这样的文档字符串,然后人们必须自己查看源代码?或者我将所有正确的类放到一个模块中,并在文档字符串中引用该文件?
发布于 2012-09-12 18:11:06
我看不出isinstance()的用法有什么不妥,我会创建一个基类并参考基类的文档。
def compare_stocks(stock1, stock2, date):
""" Compares stock data of two FinanceData objects at a certain time. """
if isinstance(stock1, FinanceData) and isinstance(stock2, FinanceData):
return 'comparison'
class FinanceData(object):
def get_stock(self, date):
""" Returns stock data in format XX, expects parameter date in format YY """
raise NotImplementedError
class GoogleFinanceData(FinanceData):
def get_stock(self, date):
""" Implements FinanceData.get_stock() """
return 'important data'正如您所看到的,我在这里没有使用鸭子类型,但是既然您在文档中提出了这个问题,我认为这是一种更简洁的可读性方法。每当另一个开发人员看到compare_stocks函数或get_stock方法时,他就会确切地知道他必须在哪里查找有关功能、数据结构或实现细节的进一步信息。
发布于 2012-09-12 18:10:58
如果您所做的只是使用*FinanceData实例调用函数,那么我甚至不会费心测试get_stock方法;传入任何其他内容都是错误的,并且如果有人传入字符串,函数就会中断。
换句话说,只需将您的函数记录为预期的get_stock()方法,而根本不进行测试。鸭子类型适用于需要接受截然不同类型的输入的代码,而不适用于只适用于一种特定类型的代码。
发布于 2012-09-12 18:00:09
按你的建议做,在文档字符串中输入传递的参数应该有一个get_stock函数,这是你的函数所需要的,列出类是不好的,因为当适合某人时,代码可能很好地与派生类或其他类一起使用。
https://stackoverflow.com/questions/12385619
复制相似问题