python中为什么没有属性赋值的“with”语句?
Python有一个'with'语句,封装了块的执行,在块的入口和出口处调用代码。有些语言的结构是这样的:
with obj:
a = 1 # equivalent to obj.a = 1
total = total + 1 # obj.total = obj.total + 1
在Python中,这样的结构是不明确的。
其他语言,例如 ObjectPascal、Delphi 和 C++ 使用静态类型,因此对于分配给哪个成员没有歧义。这就是静态类型的重点——编译器在编译时总是知道每个变量的范围。
Python 使用动态类型。无法提前知道在运行时引用了哪个属性。可以动态地从对象中添加或删除成员属性。这使得通过简单阅读无法知道引用了哪些属性:本地属性、全局属性或成员属性?
例如,采用以下不完整的代码段:
def foo(a):
with a:
print(x)
该片段假定“a”必须具有名为“x”的成员属性。但是,解释器在 Python 中没有被告知这一点。假设“a”是一个整数,会发生什么?如果有一个名为“x”的全局变量,它会在 with 块中使用吗?如你所见,Python 的动态特性使这种选择更加困难。
但是,Python 可以通过赋值轻松实现“with”和类似语言功能(减少代码大小)的主要好处。代替:
function(args).mydict[index][index].a = 21
function(args).mydict[index][index].b = 42
function(args).mydict[index][index].c = 63
写成这样:
ref = function(args).mydict[index][index]
ref.a = 21
ref.b = 42
ref.c = 63
这也有提高执行速度的副作用,因为 Python 在运行时解析名称绑定,而第二个版本只需要执行一次解析。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Python 使用生成器实现协程12/17
- ♥ python文件不存在时创建文件08/19
- ♥ python函数是否传递数组参数09/23
- ♥ 如何编写python脚本10/19
- ♥ 如何在python中获取范围内的随机数11/01
- ♥ 深入理解Python的set和dict12/14
内容反馈