Python 如何正确记录hasattr()的使用

Python 如何正确记录hasattr()的使用,python,Python,我发现使用isinstance()并不被认为是pythonic,人们建议使用hasattr() 我想知道最好的方法是用hasattr()记录函数的正确使用 例如: 我从不同的网站(如Yahoo Finance、Google Finance)获取股票数据,有GoogleFinanceData和YahooFinanceData两个类都有一个方法get_stock(date)。 还有一个函数用于比较两种股票的价值: def compare_stocks(stock1,stock2,date):

我发现使用
isinstance()
并不被认为是pythonic,人们建议使用
hasattr()

我想知道最好的方法是用
hasattr()
记录函数的正确使用

例如: 我从不同的网站(如Yahoo Finance、Google Finance)获取股票数据,有
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
?我是否应该编写一个docstring,比如
“stock1和stock2应该有一个方法get_stock”
,人们必须自己查看源代码?还是将所有正确的类放在一个模块中,并在docstring中引用该文件?

按照您的建议,将传递的参数应具有get_stock函数的docstring放入其中,这是您的函数所要求的,列出类是不好的,因为在适合某人的情况下,代码可能会与派生类或其他类一起使用。

按照您的建议,输入docstring,其中传递的参数应具有get_stock函数,这是您的函数所需的,列出类是不好的,因为在适合某人的情况下,代码可能会与派生类或其他类一起使用。

如果您所做的只是使用
*FinanceData
实例调用函数,那么我甚至不会费心测试
get\u stock
方法;传入任何其他内容都是错误的,如果有人传入字符串,函数应该会中断


换句话说,只需将您的函数记录为需要一个
get_stock()
方法,而不需要进行任何测试。Duck类型用于需要接受不同类型输入的代码,而不是只适用于一种特定类型的代码。

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


换句话说,只需将您的函数记录为需要一个
get_stock()
方法,而不需要进行任何测试。Duck类型用于需要接受明显不同类型输入的代码,而不是只适用于一种特定类型的代码。

我看不出使用
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'

正如您所看到的,我在这里不使用duck类型,但是由于您在文档方面提出了这个问题,我认为这是一种更干净的可读性方法。每当其他开发人员看到
compare\u stocks
函数或
get\u stock
方法时,他都确切地知道他必须在哪里查找有关功能、数据结构或实现细节的进一步信息。

我看不出使用
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'
正如您所看到的,我在这里不使用duck类型,但是由于您在文档方面提出了这个问题,我认为这是一种更干净的可读性方法。每当其他开发人员看到
compare_stocks
函数或
get_stock
方法时,他都确切地知道他必须在哪里查找有关功能、数据结构或实现细节的进一步信息