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 在运行时解析名称绑定,而第二个版本只需要执行一次解析。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ pypi上有python安装包吗?12/29
- ♥ python如何使用merge实现堆01/04
- ♥ Python 56个内置函数详解(七)12/13
- ♥ python tarfile解压失败如何解决12/01
- ♥ 如何在cmd中找到已安装的Python201/04
- ♥ 如何在python中找到数字的平方根08/12
内容反馈