有没有办法在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]...
,列表理解,正常赋值等...)。
尝试使用就像尝试放置 confuses the sublime text syntax highlighter,而我显然不够聪明,无法理解这是否是不可能的来自正式的语法定义。for
一样无效
有没有更好的方法,然后手动解包元组?
答案 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)