【问题标题】:How to indicate multiple unused values in Python?如何在 Python 中指示多个未使用的值?
【发布时间】:2018-04-14 00:45:00
【问题描述】:

通常在 Python 中,应该使用_ 来指示未使用的参数。

def example_basic(unused):
   pass

变成

def example_basic(_):
   pass

那么如果有多个未使用的参数,则不能使用多个_s,因为它们会冲突,所以使用*_

def example_multiple(unused1, unused2):
   pass

变成

def example_multiple(*_):
   pass

最后,如果有多个不相邻的参数未被使用,该怎么办?

def example_non_adjacent(unused1, used, unused2):
    return used

使用多个_s 仍然不起作用,使用*_ 将不起作用,因为它们不相邻。

请注意,我非常希望更改 API,但为了这个问题,让我们假设这是不可能的。有没有办法在不使用 # pylint: disable=unused-argument for PyLint 或 i-dont-know-what for PyCharm 的情况下指示它被忽略?

编辑:

我发布了一个需要此功能的示例here

【问题讨论】:

  • 为什么要在函数定义中有一个未使用的参数?
  • 来自多态性或以其他方式使用框架。我们现在正在使用 django rest 框架来解决它,尽管我很确定我们可以解决它。也就是说,我一直很好奇是否有正确的方法来做到这一点。
  • _ 主要用于当您从某个地方获得返回值并且您没有使用该值时。不在函数定义中。
  • 我只是用它应该是什么来命名这个参数。例如,如果它应该是一个连接,请将其命名为 connection,即使您实际上并没有对该连接做任何事情。
  • def example_basic(_): 在我看来是错误的。请不要那样做!

标签: python pylint pep8


【解决方案1】:

我见过使用以下成语的代码;

def example_non_adjacent(_0, used, _1, _2, _3, also_used):
    ...

如果你真的有很多未使用的变量,我觉得很好。

也就是说,仅仅因为一个变量未被使用并不意味着如果你省略了它的正确名称,代码就更具可读性。仅当您确实认为隐藏变量名称​​提高了代码的可读性和/或理解时,才应该这样做。

【讨论】:

    【解决方案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
    

    【讨论】:

    • 对不起,我看错了你的答案。问题是关于 unused 参数的问题,其中 unused 具有狭窄且定义明确的含义。它们是否真的有用与我无关。
    • 在函数中定义无用的参数对我来说没有意义。我找不到这样做的案例。
    • 同样,问题不在于无用参数,而是未使用参数。
    • 无论如何,你为什么要传递一个未使用的(它不会在函数中使用)参数/参数?
    • 你没有。该框架只是以防万一您需要它。事实证明你不需要它。 Pylint 会抱怨,除非你告诉它你故意不使用这个论点。这就是 OP 想要解决的问题。
    【解决方案3】:

    如果您连接多个下划线,Pylint(很可能还有其他阅读您代码的人)会很高兴。如果您这样做,Pylint 不会抱怨未使用的参数:

    def example_non_adjacent(_, used, __):
        return used
    

    我同意一些评论,认为这是丑陋的,我会尽量避免它。

    如果您 add the prefix cb_ 向您的函数名称传达一个事实,即它们是回调并且您必须接收一些参数,即使您不想使用,Pylint(以及大多数人类读者,我猜)也不会抱怨他们。这对我来说似乎是一个更好的解决方案。

    def cb_example_non_adjacent(unused1, used, unused2):
        return used
    

    【讨论】:

    • 函数定义中重复的参数名称是语法错误。它根本不运行。 cb_example_non_adjacent(unused1, used, unused1)
    【解决方案4】:

    我非常同意@jmd_dk 的观点。仅仅因为函数实际上并没有引用或修改参数,并不意味着它没有被“使用”。毕竟,它必须被实例化并显式传递给函数。变量名称下划线的唯一合理使用是在使用 for-loops 和列表推导时:

    numbers = {_ for _ in range(10)}
    
    for _ in numbers:
        print("Foo!")
    

    但您需要这样的解决方案这一事实意味着您的代码中存在设计问题。

    【讨论】:

    • 或者这意味着我正在使用的框架中存在设计问题:-)
    • 实际上,即使在您的集合理解中,我也更愿意将_ 替换为number 之类的东西,因为_ 实际上是在理解中重新引用的。
    • @TinyTheBrontosaurus 您介意提供实际代码吗?我很难想象问题出在框架中。
    • @Coal_ pylint 警告中“未使用”的含义正是:该参数既没有被引用也没有被分配。您可能不同意并且不使用“未使用”来表达这一点,但问题将保持不变:pylint 抱怨。
    • @Coal_ 此外,未使用的参数可能会被忽略,这就是为什么您通常希望代码分析工具向您发出警告。但不是当某些框架强迫您使用未使用的参数时。这不仅仅是为了让 pylint 开心,而是为了让 pylint 有帮助而不惹恼你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2020-10-24
    • 2022-06-11
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多