python - 获取要在 with 语句中执行的命令 block

标签 python scope with-statement

在阅读 with 语句 ( link ) 的规范时,我想尝试一些东西。这不是针对任何生产代码或任何东西,我只是在探索,所以如果这是一个坏主意,请不要太苛刻。

我想做的是在上面的链接文档中找到名为“BLOCK”的部分,然后在对 __enter__ 的调用中实际修改它。 (请参阅链接文档,就在动机和摘要部分开始之后。)

我的想法是创建我自己的动态本地命名空间。像这样:

with MyNameSpace(some_object):
    print a #Should print some_object.a
    x = 4 #Should set some_object.x=4

基本上,我希望 with block 内的语句从属于 some_object 的局部变量和赋值约定。

在我的特定情况下,some_object 可能是一个特殊的数据数组,它有我自己的列操作或其他东西。在这种情况下,说类似 x = y + 5 if y > 4 else y - 2 的内容可能是一些花哨的 NumPy 矢量化操作,但我不需要显式调用 some_object 这些方法的接口(interface)。在命名空间中,表达式应该“正常工作”(但是我将它们定义为在 MyNameSpace 类中推断。

我的第一个想法是以某种方式中断 with 过程并获取 try block 中的代码。然后在 __enter__ 被调用时解释该代码,并将 try block 中的代码替换为其他内容(如果可行的话,可能是 pass ,但是可能会将 some_object 恢复到原始变量范围,并保留其新更改的变量)。

一个简单的测试用例应该是这样的:

my_dict = {'a':3, 'b':2}
with MyNameSpace(my_dict):
    print a # Should print 3
    x = 5 # When the block finishes, my_dict['x'] should now be 5

如果这个想法已经存在于某个地方,我很感兴趣。

我知道分配变量的最佳实践。这是一个宠物项目,所以请假设,仅仅为了这个想法,我们可以忽略最佳实践。即使您不喜欢以这种方式分配变量,它也可能对我当前的项目有用。

编辑

为了澄清我可能想要做的棘手事情的种类,并解决下面声称无法完成的答案,请考虑下面的示例文件 testLocals.py:

my_dict = {'a':1, 'b':2}
m = locals()
print m["my_dict"]['a']
m["my_dict"]['c'] = 3
print my_dict

class some_other_scope(object):
    def __init__(self, some_scope):
        x = 5
        g = locals()
        some_scope.update(g)
        some_scope["my_dict"]["d"] = 4

sos = some_other_scope(m)
print my_dict
print x

当我以非交互方式运行它时,它会给出以下结果:

ely@AMDESK:~/Desktop/Programming/Python$ python testLocals.py
1
{'a': 1, 'c': 3, 'b': 2}
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
5

最佳答案

试试这个。

import sys 
class MyNameSpace(object):
    def __init__(self,ns):
        self.ns = ns
    def __enter__(self):
        globals().update(self.ns)
    def __exit__(self, exc_type,exc_value,traceback):
        self.ns.update(sys._getframe(1).f_locals)

my_dict = {'a':3, 'b':2} 
with MyNameSpace(my_dict) as ns:
    print(a) # Should print 3
    x = 5 # When the block finishes, my_dict['x'] should now be 5 

print(my_dict['x'])

关于python - 获取要在 with 语句中执行的命令 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12485837/

相关文章:

groovy - Groovy:if-then语句是否具有局部作用域?

javascript - 修改函数表达式中的类变量

postgresql - 在 POSTGRESQL 中使用带有 INSERT 语句的 WITH 子句

python - 检查元组列表是否包含第一个元素作为定义字符串的元组

python - 基于密度的聚类如何获取属于其簇的文档?

python - 在 pandas GroupBy 输出中将缺少的组键作为 NaN 包括在内

c++ - 链接器无法在命名空间中找到函数定义

javascript - 为什么 eval 不能访问 with 语句下的作用域变量?

SQL - WHERE 子句中的 With 语句

python - 为什么 unittest.mock.ANY 不能与 Django 对象正常工作?