我正在尝试根据环境变量的返回值进行条件赋值。
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,或者还有其他方法可以解决这个问题吗?
感谢。
答案 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('...'), '')