2012-11-07 7 views
2

환경 변수에 대한 반환 값을 기반으로 조건부 할당을 시도하고 있습니다. CDO_TBLPATH 내가 없음 연결 오류 문자열을 얻을 정의되지 않은 경우Python : None을 반환하는 문자열 연결 없음?

self._TBLFilePath = iTBLFilePath or os.environ.get("CDO_TBLPATH") + os.environ.get("CDO_INSTANCE_TYPE") + ".tbl" or os.environ.ge t("CDO_ROOT") + "/cdo/tbl/" + os.environ.get("CDO_INSTANCE_TYPE") + ".tbl" 

문제입니다. None + 문자열이 None을 반환하도록 강제하는 방법이 있는지 궁금하거나이 문제를 극복하기위한 다른 방법이 있습니까?

감사합니다.

답변

3

mapping.get()는 '기본'인수를 지원합니다

os.environ.get("CDO_TBLPATH", '') 

기본값은 None을 반환하지만, 빈 문자열을 지정하여 연결은 CDO_TBLPATH가 정의되지 않은 경우에도 작동합니다.

.get()이없는 경우 병합으로 마법을 사용하여 None을 반환 할 수 없습니다. __add__ 메서드에서 None을 반환하는 사용자 지정 클래스를 사용할 수는 있지만 매우 읽기 쉽지는 확실하지 않습니다.

당신이 환경 변수가 정의되지 않은 경우 (연결할되지 않음) 옵션을 생략해야하는 경우, 오프 분할 밖으로 시험 좋을 것 : 이것은 일련의 테스트를 정의

table_options = (
    (lambda: iTBLFilePath, lambda: iTBLFilePath) 
    (lambda: os.environ.get("CDO_TBLPATH") and os.environ.get("CDO_INSTANCE_TYPE"), 
     lambda: os.environ["CDO_TBLPATH"] + os.environ["CDO_INSTANCE_TYPE"] + '.tbl'), 
    (lambda: os.environ.get("CDO_ROOT") and os.environ.get("CDO_INSTANCE_TYPE"), 
     lambda: os.environ["CDO_ROOT"] + "/cdo/tbl/" + os.environ["CDO_INSTANCE_TYPE"] + ".tbl"), 
    (lambda: True, lambda: None), 
) 

self. _TBLFilePath = next(opt() for tst, opt in table_options if tst()) 

, 성공한 첫 번째 테스트와 관련된 값이 사용됩니다.

+0

죄송합니다, 내 질문에 조금 혼란 있다면. 실제로 달성하고 싶은 것은 두 번째 피연산자 (os.environ.get ("CDO_TBLPATH") + os.environ.get ("CDO_INSTANCE_TYPE") + ".tbl")는 해당 env 중 하나의 경우에 False/None을 반환한다는 것입니다. 변수가 설정되지 않았습니다. –

0

이 때문에 나는 때때로 coalesce() 함수를 SQL에서 빌려 왔습니다. 존재하지 않는 경우 그것은 최초의 비 None 인수, 또는 None을 반환

coalesce = lambda *a: next((i for i in a if i is not None), None) 

또는

def coalesce(*a): 
    """Return the first non-`None` argument, or `None` if there is none.""" 
    return next((i for i in a if i is not None), None) 

어쩌면 더 나은 : 파이썬에서,이 방식으로 작동합니다. .get()에 대한 기본 인수가 없었다 경우

, 당신은 할 수

coalesce(get('...'), '')