2

環境変数の戻り値に基づいて条件付き割り当てを実行しようとしています。

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 + string も None を返すように強制する方法があるのだろうか、またはこれを克服する他の方法はありますか?

ありがとう。

4

2 に答える 2

3

mapping.get()「デフォルト」引数をサポートします。

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

デフォルトでは が返されますがNone、空の文字列を指定すると、 がCDO_TBLPATH定義されていなくても連結が機能します。

None を返すNone場合、連結を魔法のように返すことはできません。メソッドで返される.get()カスタム クラスを使用できますが、それが非常に読みやすいかどうかはわかりません。None__add__

環境変数が定義されていない場合にオプションのいずれかをスキップする (連結しない) 必要がある場合は、テストを分割することをお勧めします。

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())

これは一連のテストを定義し、成功した最初のテストに関連付けられた値が使用されます。

于 2012-11-07T15:24:58.873 に答える
0

このために、coalesce()SQL から関数を借用することがあります。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('...'), '')
于 2012-11-07T15:28:50.683 に答える