【问题标题】:Python: Is it possible to unpack a sequence type inline in a "with" statementPython:是否可以在“with”语句中解压缩序列类型内联
【发布时间】:2018-03-18 23:06:01
【问题描述】:

有没有办法在 python 中的 with 语句中进行内联解包?

现在,我有一个自定义上下文管理器,它返回一个 sqlalchemy row 对象,关联的 session 需要将其作为 2 元组潜在地删除,并在上下文退出时处理必要的数据库操作:

with self.row_sess_context(dbid=relid) as tup:
    row, sess = tup

    ...[manipulation code]...

现在,在我看来,能够执行以下操作会特别“pythonic”:

    with self.row_sess_context(dbid=relid) as row, sess:

    ...[manipulation code]...

特别是因为 python 已经在大多数其他上下文中支持序列解包(for、列表理解、正常分配等)。

尝试尝试输入row, sess 是无效的 confuses the sublime text syntax highlighter,我显然不够聪明,无法理解这是否完全不可能从正式的语法定义中获得。

有没有比手动解压元组更好的方法?

【问题讨论】:

  • “试图将row, sess 放在括号中似乎没有用”——你能详细说明一下吗?根据我对语法的阅读,应该可以。
  • 你想做什么works just fine。如果您的代码不起作用,则说明您做错了什么,您需要向我们展示代码以便我们修复它,而不仅仅是告诉我们它存在并且由于某种原因不起作用。
  • @jwodder - 见编辑。原来我只是个傻瓜。
  • @abarnert - 见编辑。原来我只是个傻瓜。

标签: python python-3.x


【解决方案1】:

Arrrgh,所以我被语法高亮所困扰。

可以做:

with self.row_sess_context(dbid=relid) as (row, sess):

但它破坏了原生 sublime-text python 突出显示,所以我认为它是无效的。

见:https://github.com/sublimehq/Packages/issues/1467

至少我得到了一个错误报告。

【讨论】:

    【解决方案2】:

    你试图写的东西不起作用:

    with self.row_sess_context(dbid=relid) as row, sess:
    

    ...因为with 语句可以接受多个上下文管理器并绑定每个上下文值,所以您要求它输入self.row_sess_context(dbid=relid) 并将其值绑定为row,然后输入sess 并忽略它价值。由于sess 可能不是上下文管理器,因此这是一个错误。

    但是,如果您只是将 unpackables 用括号括起来,它就会完全按照您的意愿行事:

    with self.row_sess_context(dbid=relid) as (row, sess):
    

    由于无法用不完整的代码片段进行演示,所以这里有一个任何人都可以运行的最小示例:

    import contextlib
    
    @contextlib.contextmanager
    def ctx():
        yield (1, 2)
    
    with ctx() as (x, y):
        print(x, y)
    

    【讨论】:

    • 是的,我在点击“发布”后大约 30 秒就知道了。德普。
    • 别难过。我很确定我和 Nick Coghlan 争论过,当他第一次提出这个问题时,没有人会犯这个错误,然后在下一个 Python 版本问世后不久,我自己就犯了这个错误……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多