2012-09-12 2 views
0

isinstance()을 사용하는 파이썬으로 간주되지 않으며 사람들은 다음과 같이 제안합니다. hasattr()을 사용하십시오.hasattr() 사용법을 올바르게 작성하는 방법

가장 좋은 방법은 hasattr()을 사용하는 함수의 적절한 사용을 문서화하는 것입니다.

예 : 내가 다른 웹 사이트 (예를 들어 야후 금융, Google 금융)에서 주식 데이터를 얻을 수 및 클래스 GoogleFinanceData 모두이 방법 get_stock(date)YahooFinanceData이 있습니다. 개의 주식의 값과 비교하는 기능도있다 :이 함수는 다음과 같이 사용된다

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

isinstance()의 사용과 관련하여 unpythonic이 보이지 않습니다. 기본 클래스를 만들고 기본 클래스의 문서를 참조합니다. 당신은 내가 여기에 오리 타이핑을 사용하지만,이 문서에 관해서이 질문을 한 이후로하지 않는시피

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

인수를 전달한 docstring에 get_stock 함수가 있어야합니다. 즉, 함수에 필요한 함수가 있어야합니다. 목록 작성 클래스는 코드가 파생 클래스 나 다른 클래스와 잘 어울릴 수 있으므로 좋지 않습니다.

3

*FinanceData 인스턴스가있는 함수를 호출하는 경우 get_stock 메서드를 테스트하는 데 신경 쓰지 않아도됩니다. 다른 것을 전달하는 것은 오류이며 누군가가 문자열을 전달하면 함수가 중단됩니다.

즉, get_stock() 메소드를 기대하는 것으로 함수를 문서화하고 테스트하지 마십시오. 오리 타이핑은 하나의 특정 유형에 대해서만 작동하는 코드가 아니라 다른 유형의 입력을 분명하게 받아 들여야하는 코드 용입니다.

관련 문제