【问题标题】:Python looping PEP8 rule [duplicate]Python循环PEP8规则[重复]
【发布时间】:2012-10-31 02:55:00
【问题描述】:

可能重复:
Is it possible to implement a Python for range loop without an iterator variable?

只是想多次做某事所以我写了

    for i in range(1, 10):
        print 'something'
        print 'do not use i'

所以当我运行 PyLint 时,它会说:“未使用的变量 'i'”当然。 那么在我只想循环多次的情况下编写这种类型的循环的正确方法是什么。

    i = 0
    while i < 10:
        print 'test'
        i += 1

这是唯一的方法吗?

【问题讨论】:

标签: python loops for-loop unused-variables


【解决方案1】:

虽然您可以将i 替换为_,但首先编写循环是完全可以的,而以任何其他方式编写它对于大多数Python 程序员来说可能会被认为是陌生的。

PyLint 检查过于激进,有时应该被忽略。如果你想要的是一个检查器,它告诉你你的代码是否有可能被破坏,也许可以考虑pyflakes;或pep8,如果你想检查你的风格(变量命名等)。

【讨论】:

  • +1 强调以其他方式编写循环会令人困惑
【解决方案2】:

for i in range(..) 循环(尽管在 python2 中使用 xrange())是在 python 中循环一系列数字的正确方法。在这种情况下,应该忽略 pylint 警告。但是,对于未使用的变量,通常将其命名为 _,以便更清楚地表明它没有被使用。

虽然有其他方法来循环,但效率较低,因为它们通常涉及函数调用。除此之外,这样做并不是人们在阅读您的代码时所期望看到的。

【讨论】:

    【解决方案3】:

    奇怪的是,我现在使用的 PyLint 版本似乎并没有为这个特定示例中未使用的变量哭泣。尽管如此,有几种选择:

    • 直接使用迭代器:

      i = iter(range(1, 10))
      
      try:
          while i.next():
              pass
      except StopIteration:
          pass  # safely ignore
      
    • 在文件顶部添加 PyLint 注释以禁用警告:

      # pylint: disable=X0123
      # NOTE: X0123 is just an example, I don't know the exact warning code
      
    • 可能将_ 附加到未使用的变量。我不确定这个命名约定是否得到尊重,但在官方user manual中提到:

      在我们的项目中,我们刚刚接受了我们必须对代码进行一些修改以取悦 PyLint: 坚持更多的命名约定(下划线结尾的未使用变量,...)

    【讨论】:

    • 为什么不用iter(range(1, 10)) 或者更好的xrange(1, 10) 而不是range(1, 10).__iter__()
    • 我认为你应该提到选项 1 永远不应该在任何可以使用正常循环的实际代码中使用。
    • 选项 1 不等同于原始循环,因为它在迭代器返回 False 值时中断,并且因为它会吞下循环体内引发的 StopIteration。更忠实的等价物是while True,其条件以try: i.next() except StopIteration: break 终止。
    • 我觉得初始入口已经够丑了,谢谢@user4815162342。我很务实,知道迭代器不会返回 False 值,如果您担心块中出现 StopIterator 异常,这意味着:1)您没有使用任何控制流工具,它自己处理异常,2)您忘记在其中捕获异常并且刚刚完成并射中了自己的脚!
    • 它在大多数情况下都有效,是的,但有时确实会发生错误,而那些通过泄漏StopIteration 表现出来的错误并非完全没有听说过。务实地依赖迭代器从不返回 False 值会创建聪明但脆弱的代码,但这更多的是品味不同。
    猜你喜欢
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多