通常在Python中,应该使用_
来表示参数未使用。
def example_basic(unused):
pass
变为
def example_basic(_):
pass
然后,如果有多个未使用的参数,则不能使用多个_
,因为它们会发生冲突,因此使用*_
:
def example_multiple(unused1, unused2):
pass
变为
def example_multiple(*_):
pass
最后,如果有多个不相邻的参数未使用,应该怎么做?
def example_non_adjacent(unused1, used, unused2):
return used
使用多个_
仍然不起作用,使用*_
将无效,因为它们不相邻。
请注意,我非常希望更改API,但为了这个问题,让我们假设这是不可能的。有没有办法表明它被忽略而没有使用类似# pylint: disable=unused-argument
的PyLint或者我不知道什么用于PyCharm?
编辑:
我发布了一个需要here
的示例答案 0 :(得分:5)
我看过使用以下习语的代码;
def example_non_adjacent(_0, used, _1, _2, _3, also_used):
...
如果你真的有很多未使用的变量,我觉得很好。
那就是说,仅仅因为变量未使用并不意味着如果省略其正确名称,代码就更具可读性。只有在您真的认为隐藏变量名提高代码的可读性和/或理解时才应该这样做。
答案 1 :(得分:3)
如果连接多个下划线,Pylint(很可能是代码的其他读者)会很高兴。如果您这样做,Pylint不会抱怨未使用的参数:
def example_non_adjacent(_, used, __):
return used
我同意一些丑陋的评论者,我会尽力避免这种做法。
Pylint(以及大多数人类读者,我猜)如果你add the prefix cb_
对你的函数名称传达它们是回调的事实并且即使你不想要你也必须接受一些论证,也不会抱怨使用它们。这对我来说似乎是一个更好的解决方案。
def cb_example_non_adjacent(unused1, used, unused2):
return used
答案 2 :(得分:2)
只需del
他们。由于垃圾收集器的工作方式,它速度很快。
def test(test):
del test
print('I do not need test parameter here!')
如果您使用回调方法传递参数,则为其指定正确的名称并del
。不要将它们表示为未使用。
这是一个示例回调函数:
def handle(socket, address):
del address # del is as efficient as a newline ;-)
stream = bytes()
while True:
chunk = socket.recv()
if not chunk:
break
stream += chunk
return stream
Pythonistas通常不会在参数中使用_
下划线名称
您可能误解了使用_
下划线作为非有用变量的名称。
当我们不知道如何调用它和/或它不会被使用时,将_
用于变量名是可以理解的:
# ignore variables when unpacking a tuple
def test():
"""some code here"""
top = 10
right = 10
bottom = 40
left = 10
return top, right, bottom, left
# here we ignore right and left
top, _, bottom, _ = test()
# use top and bottom in your code
答案 3 :(得分:1)
我非常赞同@jmd_dk。仅仅因为函数实际上没有引用或修改参数,并不意味着它没有被“使用”。毕竟,它必须实例化并显式传递给函数。对变量名唯一合理使用下划线是使用for
- 循环和列表推导时:
numbers = {_ for _ in range(10)}
for _ in numbers:
print("Foo!")
但是,您需要这样的解决方案,这意味着您的代码中存在设计问题。