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 ,或者有没有其他方法可以克服这个问题?

谢谢。

4

2 回答 2

3

mapping.get()支持“默认”参数:

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

默认为 return None,但通过指定一个空字符串,即使CDO_TBLPATH未定义,您的连接也将起作用。

None如果.get()返回 None,你不能让连接神奇地返回;您可以使用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 回答