2009-12-26 4 views
5

코드를 바보로 만들려고 노력하지만 많은 것을 입력하는 데 많은 시간이 걸리므로 코드를 읽는 데 더 많은 시간이 걸립니다.파이썬 코드를 가독성을 높이기 위해 바보로 만들지 않아야합니까?

class TextServer(object): 
    def __init__(self, text_values): 
     self.text_values = text_values 
     # <more code> 
    # <more methods> 

내가 이것을 쓰는 경향이있다 :

class TextServer(object): 
    def __init__(self, text_values): 
     for text_value in text_values: 
      assert isinstance(text_value, basestring), u'All text_values should be str or unicode.' 
      assert 2 <= len(text_value), u'All text_values should be at least two characters long.' 
     self.__text_values = frozenset(text_values) # <They shouldn't change.> 
     # <more code> 
    @property 
    def text_values(self): 
     # <'text_values' shouldn't be replaced.> 
     return self.__text_values 
    # <more methods> 

내 파이썬 코딩 스타일이 너무 편집증가 대신

? 아니면 가독성을 유지하면서 가독성을 향상시킬 수있는 방법이 있습니까?

  • 주 1 : 그냥 해명을 <> 사이에 주석을 추가했습니다.
  • 주 2 : 내 코드를 학대 방지하려고 주요 바보 내 미래의 자기입니다.

답변

11

여기 this page에서 파이썬 관용구에 대한 좋은 충고 :


캐치 오류보다는 그들을 피하는 특별한 경우로 코드의 혼란을 방지하기 위해. 이 관용구는 EAFP ('허가보다 용서를 구하는 것이 더 쉽다')라고 불리는데, LBYL ('도약하기 전에보세요')과 반대입니다. 이것은 종종 코드를 더 읽기 쉽게 만듭니다. 예를 들면 :

더 나쁜 :

#check whether int conversion will raise an error 
if not isinstance(s, str) or not s.isdigit: 
    return None 
elif len(s) > 10: #too many digits for int conversion 
    return None 
else: 
    return int(str) 

더 나은 :

try: 
    return int(str) 
except (TypeError, ValueError, OverflowError): #int conversion failed 
    return None 

(이 경우 그 주

가, 두 번째 버전이 올바르게 선도 + 및 처리하기 때문에, 훨씬 더 -, 또한 2 100 억 사이의 값 (32 비트 시스템 용) 모든 가능한 오류를 예측하여 코드를 복잡하게하지 마십시오. 단지 적절한 예외 처리를 시도하고 사용)

+1

네 말이 맞아,하지만 다른 한편으로는 가능한 한 빨리 실패하는 것이 좋다. 'text_values' frozenset 속성의 값은 나중에 사용되기 때문에 잘못된 값으로 속성을 설정하는 것이 무엇인지 알아내는 것이 더 어려울 것입니다. –

9

는 "내 파이썬입니다. 너무 지나친 편집 스타일? 아니면 바보 - 증거를 유지하면서 가독성을 향상시킬 수있는 방법은 무엇입니까? "

누가 당신은?

에서 당신 자신을 보호하고있는 바보? 당신은 당신이 쓴 API를 기억하지 않았다는 것을 걱정 있습니까?

동료가 있습니까? 다음 큐비클에있는 누군가가 API를 통해 잘못된 것을 전달하려고 적극적으로 노력하겠습니까?이 문제를 해결하기 위해 대화를 나눌 수 있습니다. 문서를 제공하면 코드가 많이 저장됩니다.

코드를 다운로드하고 API 문서를 읽지 않고 전체를 호출하는 전체 변종 군인 부적당 한 논증이있는 방법? 가능한 도움을 제공 할 수 있습니까?

"바보 같은"코딩은 이러한 시나리오가 모두 다른 방식으로보다 쉽게 ​​다루기 때문에 실제로별로 도움이되지 않습니다.

자신을 속일 바보 인 사람이라면 아마도 그렇게 합리적인 것이 아닙니다.

동료 나 동료를 속여서 실수를 저지르는 사람이라면 그들과 대화하고 그들이 API 문서를 이해하는지 확인해야합니다.

API를 파괴하려고하는 가상의 사회 사업가 프로그래머를 속일 수 없다면 할 수있는 일이 없습니다. 파이썬이야. 그들은 근원을 가지고있다. API를 잘못 사용하기 위해 소스를 편집 할 수있을 때 왜 API를 오용하려는 노력을 했습니까?

3

파이썬에서는 비공개 인스턴스 속성을 사용하고 속성을 통해 노출합니다. 그냥 self.text_values을 사용하십시오.

3

코드가 인 경우 편집증 (특히 자신에 대해서만 보호하려는 경우).

파이썬 서클에서 LBYL은 일반적으로 (항상 그런 것은 아닙니다) 빗나가게됩니다. 그러나 또한 (좋은) 단위 테스트를 가지고 있다는 (종종 무의미한) 가정이 있습니다.

나 개인적으로? 나는 가독성이 가장 중요하다고 생각한다. 내 말은, 만약 당신이 그것이 읽기 어렵다고 생각한다면, 다른 사람들은 어떻게 생각할까요? 그리고 덜 읽기 쉬운 코드는 버그를 잡을 가능성이 더 큽니다. 당신은 당신의 코드가 완전히 고장이 만들려고하면 어렵게에/더 많은 시간이 소요 (당신이 코드가 실제로 모든 LBYLing에을 무엇을 찾기 위해 발굴해야합니다) 작업을하게 언급하지

2

, 누군가가 더 나은를 발명한다 바보. 진지하게 말하면, 가능성이있는 오류를 방지하는 것이 좋습니다. 그러나 호출자가 여러분을 망칠 수있는 모든 생각할 수있는 방법을 생각하려고 코드를 어지럽히 지 마십시오.

+1

"너는 뭔가를 실수로 만들 수는 있지만 어쩔 수없이 만들 수는 없다"는 것을 상기시켜줍니다. –

+0

또한 다음 번에 살펴볼 때, 미래는 분명히 더 경험이 풍부한 바보가되어 현재 작성한 것보다 당신의 증명을 우회하는 방법이 더 사악합니다. – Kimvais

2

대신에 assert으로 시간을 보내고 개인 변수 i는 문서화 및 테스트 케이스에서 시간을 보내기를 선호합니다. 나는 읽기 문서를 선호하며 코드를 읽어야 할 때 읽기 테스트를 선호합니다. 이것은 더 많은 코드가 성장할수록 더 사실입니다. 동시에 테스트는 바보 같은 코드와 유용한 유스 케이스를 제공합니다.

2

나는 그것이 검사하고있는 오류의 결과에 대한 오류 검사 코드의 필요성을 기반으로합니다. 쓰레기 데이터가 내 시스템에 도착하면 발견하기까지 얼마나 걸릴지 문제가 쓰레기 데이터인지 판단하는 것이 얼마나 어려울 것이며 수정하기가 얼마나 어려울까요? 게시 한 것과 같은 경우 응답은 일반적으로 "길지 않다", "어렵지 않다"및 "어렵지 않습니다."입니다.

그러나 6 주 후에 복잡한 알고리즘의 입력으로 사용되는 데이터는 그대로 유지 될까요? 나는 그걸 확인해 볼게.

0

저는 이것이 파이썬에만 국한된 것이라고 생각하지 않습니다. 나는 계약에 의한 디자인을 확고히 믿는다 : 이상적으로 모든 기능은 명확한 사전 및 사후 조건을 가져야한다. 불행히도 대부분의 언어 (표준 예외 인 에펠)는 명확성과 정확성 사이의 명백한 충돌에 기여하는 이것을 달성하는 특히 편리한 방법을 제공하지 않습니다.

실용적인 문제 중 하나는 어림짐작을 피하기 위해 'checkValues'메소드를 작성하는 것입니다. __init__. 당신은 심지어로 압축 할 수 있습니다 :

def __init__(self, text_values): 
    self.text_values = checkValues(text_values) 

def checkValues(text_values): 
    for text_value in text_values: 
     assert isinstance(text_value, basestring), u'All text_values should be str or unicode.' 
     assert 2 <= len(text_value), u'All text_values should be at least two characters long.' 
    return(frozenset(text_values)) 

일부 주석 규칙의 도움으로 사전 조건을 표시/숨기기 할 수있는 접이식 텍스트 편집기를 사용하는 것입니다 또 다른 접근 방법; 이것은 또한 자동 생성 문서화에 유용 할 것입니다.

0

인자 체크에 필요한 모든 힘을 다하여 명확하고 간결한 문서 문자열을 작성하는 대신에 채널로 전달하십시오.

핵 원자로에 대한 코드를 작성하지 않는 한; 이 경우 두 가지를 해 주셔서 감사합니다.

0

생각할 또 다른 방법은 수정할 수있는 오류 만 잡으면됩니다. AssertionError을 사용하여 중단을위한 입력을 확인하는 중이라면 올바르게 디버깅 할 수 있도록 코드에서 나중에 적절한 예외를 발생시키는 것이 좋습니다.

특히이 줄은 오리 타이핑 중지 꽤 나쁜 :

 assert isinstance(text_value, basestring), u'All text_values should be str or unicode.' 
관련 문제