python - Python with statement: '语法错误:无效语法'
问题描述
我尝试了以下代码:
with x as 1:
y = 1
with z as 1:
w = 1
编译器报告了 SyntaxError: invalid syntax。问题是什么?
[编辑:]我想做的是:
import tensorflow as tf
with tf.variable_scope("model"):
y = 1
with tf.variable_scope("model2"):
z = 1
我想更改 tensorflow 中的名称范围以共享变量。我查看了在线教程,但这并没有太大帮助。
解决方案
稍微过度简化,您的代码:
with x as 1:
y = 1
......翻译成这样的东西:
try:
1 = x.__enter__()
y = 1
finally:
1.__exit__()
写作1 = x.__enter__()
显然会引发 a SyntaxError: can't assign to literal
,因为给字面常量分配一个新值没有任何意义1
。
在语句中做同样的事情with
会引发同样的异常。(在旧版本的 Python 中(我认为只有 2.5?),错误消息不是很有用,它只是说SyntaxError: invalid syntax
,但问题是一样的。)
根据. x
_ SyntaxError
_ AttributeError: __enter__
只有上下文管理器可以在with
语句中使用。粗略地说,这些东西知道如何在自己之后进行清理,并且无论如何让它们在某个代码块的末尾进行清理是很重要的。文件就是典型的例子:self.close()
当你退出块时它们会调用,这样可以确保你不会因为有数百个打开的文件而出现操作系统错误,或者无法刷新最后一个文件write
,或者其他类似的问题。
有关 的更多信息with
,请参阅PEP 343,最初添加with
到 Python 2.5 的提案,或了解 Python 的“with”语句(来自 effbot)。
所以,这里的问题是:你想做什么?如果您只想将值分配给1
name x
,您已经知道如何做到这一点,因为您y
在下一行使用了它:just x = 1
。如果您尝试做一些不同的事情……好吧,可能有办法做到这一点,但with
可能离正确答案还很远。
推荐阅读
- angular - 在 Angular 中链接安全导航运算符未按预期工作
- javascript - Popper菜单上的Z-Index?
- dart - Flutter 获取设备 MAC 地址
- c# - 在内部范围的调度程序上等待运行后如何强制代码?
- c - C - 当我从文件中读取矩阵时,为什么前几个元素会失真?
- ios - Fabric Crashlytics 崩溃状态视图中显示的版本号是什么?
- spring-boot - 通量
- 或 Flux in spring webflux
- python - 如何让这个脚本在后台运行并监听“复制”动作?
- python - 我想编辑用户输入的python代码
- c# - 以下数字赋值是否会导致 C# 中的隐式强制转换?