python中有没有一种方法可以在某些条件下将对象添加到列表中?
我想这样做:
middleware = ["a",
"b",
"c" if DEBUG,
"d"
]
这样,如果DEBUG
为假,则列表将是["a"、"b"、"d"]
我目前最好的建议是:
middleware = ["a",
"b"] +
(["c"] if DEBUG else []) +
["d"
]
看起来不是很直观的
您可以获得的最接近的方法是使用附加的拆包泛化来根据条件if/else
运算符的结果拆包可变长度的内部tuple
(或list
(:
middleware = ["a",
"b",
*(("c",) if DEBUG else ()), # Or if you like brackets, *(["c"] if DEBUG else [])
"d"
]
通过使用解包,您可以在两个不同的内部序列之间进行选择以解包,从而在对所需语法进行最小更改的情况下获得所需结果。
在长度为一个字符串的特定情况下,中间线可以简化为:
*("c" if DEBUG else ""),
或者甚至(如果DEBUG
是布尔值,或者0
或>0
整数值(:
*"c"[:DEBUG],
*"c" * DEBUG, # For boolean or 0/1 integers only
并且这些可以通过封装在list
括号中而扩展为无长度的一个字符串:
*["abc"][:DEBUG],
*["abc"] * DEBUG, # For boolean or 0/1 integers only
但基本上所有这些替代方案都属于";太聪明了一半";编程技巧的类别(如果你发现自己用bool
做了很多数学或切片,你可能太聪明了(。
我认为没有任何更简单的内联方式可以做到这一点。
只需写一个简单的if
语句:
middleware = ["a", "b"]
if DEBUG:
middleware.append("c")
middleware.append("d")
或
middleware = ["a", "b", "d"]
if DEBUG:
middleware.insert(2, "c")
另一种选择是从控制它的另一个列表构建middleware
列表
mware_with_options = [
{"name": "a", "type": "always"},
{"name": "b", "type": "always"},
{"name": "c", "type": "debug"},
{"name": "d", "type": "always"}
]
middleware = [item['name'] for item in mware_with_options if item['type'] = "always" or (DEBUG and item['type'] = "debug")]
如果列表中的对象都是问题中的字符串,那么一个不那么难看的折衷方案是使用带有split
的f-string:
middleware = f'''
a
b
{'c' * DEBUG}
d
'''.split()
编辑:灵感来自@superbrain的评论,修改为使用乘法运算符。
如果列表中的项目都是真值,则如果DEBUG
是False
,则可以使用and
运算符将项目设置为False
,然后从列表中过滤假项目:
middleware = [
"a",
"b",
DEBUG and "c",
"d"
]
middleware[:] = filter(None, middleware)
或者,
*middleware, = filter(None, [
"a",
"b",
DEBUG and "c",
"d"
])