2011-12-06 3 views
13

파이썬의 범위 지정 규칙으로 인해 범위 내에서 일단 초기화 된 모든 변수를 사용할 수 있습니다. 조건문은 새로운 범위를 도입하지 않으므로 다른 언어 (예 : 해당 조건 앞에 변수를 초기화하는 등)의 구문은 반드시 필요한 것은 아닙니다.조건부 변수 초기화의 비법은 무엇입니까?

def foo(optionalvar = None): 
    # some processing, resulting in... 
    message = get_message() 
    if optionalvar is not None: 
     # some other processing, resulting in... 
     message = get_other_message() 
    # ... rest of function that uses message 

또는, 우리가 대신 할 수 : 예를 들어, 우리가있을 수 있습니다 물론

def foo(optionalvar = None): 
    if optionalvar is None: 
     # processing, resulting in... 
     message = get_message() 
    else: 
     # other processing, resulting in... 
     message = get_other_message() 
    # ... rest of function that uses message 

get_messageget_other_message 기능이 많은 코드가 될 기본적으로 관련이없는 수 (당신은 추측 할 수 각 경로 이후의 프로그램 상태가 동일하다는 것); 여기서 목표는 기능의이 부분을 넘어서는 message을 사용할 준비를하는 것입니다.

더 허용 될 어떤 구조 :

나는 같은 다른 질문을 여러 번 사용 후자의 구조를 본 적이?

+1

'get_message'를 조건부로 실행할지 아니면 무조건 실행 할지를 전적으로 좌우하지 않습니까? – delnan

+0

여기에있는 아이디어는 호출 할 함수가 아니라 오히려'message'의 생성입니다. 함수 자체는 부적합합니다. –

+1

그것이 기능이든 아니든, 의미 론적 차이는 코드의 절반을 무조건 실행한다는 것입니다. 차이가 있다면 논쟁 스타일에는 별다른 의미가 없습니다. – delnan

답변

12

파이썬은 매우 유용한있다 get_message()를 불필요하게 호출하지 마라.

+1

이것은 적어도 언어 자체에 관한 한 ** 조건부 배정 (v2.5부터)을하는 Pythonic 방법입니다. 자세한 내용은 [PEP 308] (http://docs.python.org/release/2.5/whatsnew/pep-308.html)을 확인하십시오. – voithos

+0

또한 PEP 308에서 두 번째 형식이 이전에 허용 된 방식이라고 제안한 것처럼 보입니다. 알아 둘만한! –

1

나는 이것에 대한 명확한 규칙을 설정하지 않는 것이 더 좋다고 생각하며 대신에 작은 함수가 더 좋다고 생각합니다 (부분적으로는 새로운 이름이 도입되었을 때 마음 속에 유지하는 것이 가능하기 때문입니다).

조건부 테스트가 if/else보다 훨씬 복잡하다면 매우주의하지 않는 한 모든 테스트가 실패하고 나중에 정의되지 않은 이름을 사용하여 런타임 오류가 발생할 수 있다고 생각합니다. 이것이 가능한 첫 번째 스타일에 대한 논의 일 수 있습니다.

0

대답은 get_message()의 부작용이 있는지 여부에 따라 다릅니다.

원치 않는 결과를 생성하는 코드가 실행되지 않기 때문에 대부분의 경우 분명히 두 번째 것이 유리합니다. 그러나 부작용이 필요한 경우 첫 번째 버전을 선택해야합니다.

0

변수 외부에서 변수를 초기화하는 것이 더 안전 할 수 있습니다. 다른 조건을 정의하거나 일부 조건을 제거해야하는 경우 나중에 message의 사용자에게 초기화되지 않은 변수 예외가 발생할 수 있습니다. 당신이 실시 예 1과는 달리 없음

message = get_other_message() if optional_var is not None else get_message() 

엄격하게 비교하려면 구문 패턴은 당신이 아무튼 게시) 여기

message = get_other_message() if optional_var else get_message() 

또는를 사용할 수있는 경우

4

일반적으로 get_message을 무조건 호출하지 않으므로 두 번째 방법이 더 좋고 일반적입니다.이 기능은 그러니까 기본적으로, 모든 통해가는 방법을 인센티브 자원하지만 분명이 내가 두 번째 경우에 같은 나쁜 시나리오를 생각할 수 없다, 좋지 않은 검색 기능을

def search(engine): 
    results = get_from_google() 
    if engine == 'bing': 
     results = get_from_bing() 

을 고려하지 않은 경우 어느 것이 확인 될 수있다 옵션을 선택하고 마지막으로 기본값이 가장 좋습니다.

def search(engine): 
    if engine == 'bing': 
     results = get_from_bing() 
    else: 
     results = get_from_google()