2012-09-12 45 views
0

我认为使用isinstance()并不认为是pythonic,使用hasattr()如何正确记录hasattr()使用

我想知道什么是最好的方法是文件正确使用使用hasattr()函数。

例子: 我会从不同的网站(如雅虎财经,谷歌财经)股票数据,并有类GoogleFinanceDataYahooFinanceData这两者有一个方法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') 

的问题是:我如何让人们知道stock1stock2可以使用哪些类别?我是否应该编写一个像"stock1 and stock2 ought to have a method get_stock"这样的文档字符串,人们必须自己查看源代码?或者我将所有正确的类放入一个模块并在文档字符串中引用该文件?

回答

1

我没有看到什么unpythonic关于使用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方法时,他都会确切地知道他在哪里查找有关功能,数据结构或实现细节的更多信息。

1

做你的建议,放在传递参数的文档字符串中应该有一个get_stock函数,这就是你的函数所要求的,列表类是不好的,因为代码可能适合派生或其他类适用于某人。

3

如果你所做的只是调用*FinanceData实例的函数,我甚至懒得测试get_stock方法;传入任何其他内容都是错误的,如果有人传入字符串,函数应该会中断。

换句话说,只需将您的函数记录为期望get_stock()方法,而不是测试。鸭子打字是为了需要接受明显不同类型的输入的代码,而不是仅适用于特定类型的代码。

相关问题