【问题标题】:Is it possible to unpack a tuple in Python without creating unwanted variables?是否可以在不创建不需要的变量的情况下在 Python 中解压缩元组?
【发布时间】:2010-09-27 09:15:34
【问题描述】:

有没有办法编写以下函数,以便我的 IDE 不会抱怨 column 是未使用的变量?

def get_selected_index(self):
    (path, column) = self._tree_view.get_cursor()
    return path[0]

在这种情况下,我不关心元组中的第二项,只想在解包时丢弃对它的引用。

【问题讨论】:

    标签: python tuples iterable-unpacking


    【解决方案1】:

    在 Python 中,_ 通常用作被忽略的占位符。

    (path, _) = self._treeView.get_cursor()
    

    您也可以避免解包,因为元组是可索引的。

    def get_selected_index(self):
        return self._treeView.get_cursor()[0][0]
    

    【讨论】:

    • 值得注意的是,_ 不是任何一种语法魔法,而是一种约定(当然,它是 IDE 和 pylint 认可的约定,Python 约定非常强大……)
    • 没有约定,Python 将一事无成!
    • 这个约定有记录吗?
    • @Gaius:我相信在 Haskell 中它明确表示“丢弃这个值”;在 Python 中,_ 仍然是一个赋值变量,理论上你可以像使用任何其他变量一样使用它。
    • python 命令行解释器“神奇地”将 _ 分配给最后一次计算的结果,因此如果您运行某些东西但忘记存储返回值,它将在 _ 变量中为您捕获.在进行交互式工作时这是一件有用的事情。在上述情况下,我可能会做索引而不是解包。
    【解决方案2】:

    如果你不关心第二项,为什么不直接提取第一项:

    def get_selected_index(self):
        path = self._treeView.get_cursor()[0]
        return path[0]
    

    【讨论】:

    • 请注意,返回现在应该是return path,而不是return path[0]
    • 这个比较弱,因为它消除了正好有两个项目的断言。
    • @Michael Mior:我已经回滚了您的编辑:根据最初的问题,它应该仍然是path[0]path 似乎是一个序列本身)
    • 我认为这不像 _ 占位符约定那样明确。操作顺序可能存在歧义,是:(path = self._treeView.get_cursor())[0] 还是 path = (self._treeView.get_cursor()[0])
    【解决方案3】:

    是的,这是可能的。接受_ 约定的答案仍然解包,只是到一个占位符变量。

    你可以通过itertools.islice避免这种情况:

    from itertools import islice
    
    values = (i for i in range(2))
    
    res = next(islice(values, 1, None))  # 1
    

    这将给出相同的res,如下所示:

    _, res = values
    

    如上所示,该解决方案适用于values 是一个不是可索引集合的可迭代对象,例如listtuple

    【讨论】:

      【解决方案4】:

      看起来还不错,不知道性能好不好。

      a = (1, 2, 3, 4, 5)
      x, y = a[0:2]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-14
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 2017-02-25
        • 1970-01-01
        相关资源
        最近更新 更多