Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:是否可以将序列类型内联解包到一个";加上;陈述_Python_Python 3.x - Fatal编程技术网

Python:是否可以将序列类型内联解包到一个";加上;陈述

Python:是否可以将序列类型内联解包到一个";加上;陈述,python,python-3.x,Python,Python 3.x,有没有办法在python中的with语句中进行内联解包 现在,我有一个自定义上下文管理器,它返回一个sqlalchemy行对象,以及可能将其作为2元组删除所需的相关会话,并在上下文退出时处理必要的数据库操作: with self.row_sess_context(dbid=relid) as tup: row, sess = tup ...[manipulation code]... 现在,在我看来,能够做到以下几点是特别“pythonic”的: with self.

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

现在,我有一个自定义上下文管理器,它返回一个
sqlalchemy
对象,以及可能将其作为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已经在大多数其他上下文中支持序列解包(对于、列表理解、普通赋值等)


试着把sess放到行中,sess是无效的,我显然不够聪明,无法理解从正式语法定义来看这是否完全不可能


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

Arrrgh,所以我被语法突出显示所困扰

你可以做:

但是它打破了python突出显示的本机升华文本,所以我认为它是无效的

见:


至少我从中得到了一个bug报告。

您试图编写的内容不起作用:

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

但如果您只是将解压包括起来,它会完全满足您的要求:

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)

“试图将
行、sess
放在括号中似乎不起作用”-你能详细说明一下吗?根据我对语法的阅读,这应该行得通。你想做什么。如果您的代码不起作用,则表明您做错了什么,您需要向我们展示代码,以便我们能够修复它,而不仅仅是告诉我们它存在并且由于某种原因不起作用。@jwodder-请参阅编辑。原来我只是个傻瓜。@abarnert-见编辑。原来我只是个傻瓜。是的,我在点击“发帖”30秒后就明白了。德普,别难过。我敢肯定,我和Nick Coghlan争论过,当他第一次提出这个问题时,没有人会犯这个错误,而在Python的下一个版本问世后不久,我自己也犯了这个错误…
import contextlib

@contextlib.contextmanager
def ctx():
    yield (1, 2)

with ctx() as (x, y):
    print(x, y)