在阅读with
语句(链接)的规范时,我想尝试一些事情。这不是针对任何生产代码或任何内容的,我只是在探索,因此,如果这是一个坏主意,请不要太苛刻。
我想做的是在上面的链接文档中抓取一个名为“
BLOCK”的片段,然后在对的调用中进行修改__enter__
。(在动机和总结部分开始之后,请参阅链接的文档。)
这个想法是创建我自己的即时本地命名空间。像这样:
with MyNameSpace(some_object):
print a #Should print some_object.a
x = 4 #Should set some_object.x=4
基本上,我希望with
块内的语句从属于的局部变量和分配约定some_object
。
在我的特定情况下,some_object
可能是一个特殊的数据数组,它具有我自己的按列操作或类似的操作。在这种情况下,类似的话x = y + 5 if y > 4 else y - 2
可能是幕后花哨的NumPy向量化操作,但是我不需要显式调用some_object
这些方法的接口。在命名空间中,表达式应该“正常工作”(但是我将其定义为在MyNameSpace
类中进行推断)。
我的第一个想法是以某种方式中断该with
过程并掌握该try
块中包含的代码。然后__enter__
在调用该代码时解释该代码,并try
用其他内容替换该代码块中的代码(也许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执行单线循环,即: 这很好。但是,如果我在for循环之前导入模块,则会收到语法错误: 任何想法如何解决? 对我来说,将其作为一个单行放置非常重要,这样我才能将其包含在Makefile中。 问题答案: 你可以做 或不带管道: 要么 或@ SilentGhost的答案 只需使用return并在下一行输入它:
问题内容: 在node.js中,我想找到一种方法来获取Unix终端命令的输出。有什么办法吗? 问题答案: 那就是我现在正在工作的项目中这样做的方式。 示例:检索git用户
在Linux shell上,我们可以在一行中执行sql命令,如multiline: 但是sql脚本中的multiline在Windows中似乎不起作用。 如何在Windows中执行多行sql语句?mysql多行是否有某种? 当我使用echo并将其管道传输到时,输出的格式不是表 它只是输出 我希望得到以下输出:
在一个节点中。js,我想找到一种获取Unix终端命令输出的方法。有没有办法做到这一点?
通常情况下,我将执行以下操作: 然后我会得到DVD 1和DVD 2的标题。如果我想打印100个标题的DVD,显然我需要很多 我设法将这些system.out.println放在ArrayList中,如下所示: 但是,我无法执行那些system.out.println来显示标题。因此,如何执行碰巧是System.out.println命令的ArrayList的值? 非常感谢任何帮助。谢谢.
问题内容: 我正在使用Groovy在我的Linux机器上执行命令并返回输出,但是我无法以某种方式使用管道(我认为),或者它可能没有在等待命令完成。 有什么问题或我的代码中缺少什么? 我的调用函数: 文件内容(更新:添加了exitVal println): 我的输出(更新:添加了exitVal值): 注意:我在内部使用。 问题答案: 您不能使用进行管道或重定向。这在Java中不起作用,因此在Groo