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
方法时,他都确切地知道他必须在哪里查找有关功能、数据结构或实现细节的进一步信息