内联添加元素到列表if条件



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的评论,修改为使用乘法运算符。

如果列表中的项目都是真值,则如果DEBUGFalse,则可以使用and运算符将项目设置为False,然后从列表中过滤假项目:

middleware = [
"a",
"b",
DEBUG and "c",
"d"
]
middleware[:] = filter(None, middleware)

或者,

*middleware, = filter(None, [
"a",
"b",
DEBUG and "c",
"d"
])

最新更新