2012-11-07 56 views
2

我想根據環境變量的返回值做一個條件賦值。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" 

問題是何時CDO_TBLPATH未定義我得到一個字符串與無連接錯誤。我想知道是否有辦法強制None +字符串返回None,或者還有其他方法可以解決這個問題嗎?

謝謝。

回答

3

mapping.get()支持「默認」的說法:

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

默認是返回None,但通過指定一個空字符串,即使沒有定義CDO_TBLPATH您的級聯會工作。

如果.get()返回None,那麼不能將級聯奇蹟般地返回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」)將返回False/None,以防其中一個env變量未設置 –

0

爲此,我有時會從SQL中借用coalesce()函數。在Python,它的工作原理是這樣的:

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) 

如果沒有,則它返回第一個非None說法,或None

如果有對.get()沒有默認參數,你可以做

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