Python:字符串连接与None以返回None?

时间:2012-11-07 15:24:04

标签: python string conditional concatenation

我正在尝试根据环境变量的返回值进行条件赋值。

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,或者还有其他方法可以解决这个问题吗?

感谢。

2 个答案:

答案 0 :(得分: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())

这定义了一系列测试,并使用与第一个成功测试相关的值。

答案 1 :(得分: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('...'), '')
相关问题