Python:是否可以在"中使用"内联解压序列类型。声明

时间:2018-03-18 23:06:02

标签: python python-3.x

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

现在,我有一个自定义上下文管理器,它返回一个zipWith sqlalchemy对象,以及可能将其作为2元组删除的相关row,并处理必要的上下文退出的数据库操作:

session

现在,在我看来,它似乎特别是" pythonic"能够做类似的事情:

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

    ...[manipulation code]...

特别是因为python已经支持大多数其他上下文中的序列解包( with self.row_sess_context(dbid=relid) as row, sess: ...[manipulation code]... ,列表理解,正常赋值等...)。

尝试使用就像尝试放置for一样无效 confuses the sublime text syntax highlighter,而我显然不够聪明,无法理解这是否是不可能的来自正式的语法定义。

有没有更好的方法,然后手动解包元组?

2 个答案:

答案 0 :(得分:2)

Arrrgh,所以我被语法高亮所阻碍了。

可以做:

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

但它打破了原生的sublime-text python高亮显示,所以我认为它无效。

请参阅:https://github.com/sublimehq/Packages/issues/1467

至少我收到了一份错误报告。

答案 1 :(得分:0)

你要写的东西不起作用:

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)