将新名称注入上述框架

亲爱的毕达人,
我知道这可能被认为是"邪恶的伏都教",公平
足够:可能是.我猜这是个性化的.
...但是我想知道该怎么做 - 主要是为了我自己的
兴趣.
考虑以下代码片段:
---
def get( *名称):
如果没有名称:返回无
帧= sys._getFrame(1)
prevframeLocals = frame.f_locals
名称中的名称:
prevframeLocals [name] = fetchobjectnamed(name)
获取(" a"," b"," c")
打印A,B,C
---
fetchobjectnamed()是一个任意功能,它采用字符串和
返回从某个商店中获得的对象.
这在模块级别上正常工作,因为当地人中的名称/
可以通过这种方式播放Globals字典.这个想法是保存
很多打字,即
a,b,c = get(" a"," b"," c")
...在许多带有长名字的对象的打字后,变得令人沮丧.
这只是一个例子,我还有其他情况
将名称注入上面的框架会很好.
当然,当我们从功能中称为"获取"时,我们撞到了路障
而不是模块,因为当地人词典没有得到
自动复制回代码对象,因此我们必须添加此
get()函数返回之前的摘要:
来自CTYPES导入Pythonapi,py_object,c_int
pythonapi.pyframe_localstofast(py_object(frame),1)
这将名称复制到代码对象中,并且可以正常工作.
是,如果名称已经存在于代码对象中.
def myFunction():
a =无
得到")
打印#作品
获取(" B")
打印B#名称错误,B未定义
是否有任何方法可以在内部定义一个新变量
myfunction的代码对象?还是有任何程序化方法,在
运行时,将新名称插入函数中?
我不在乎它有多骇客,是否需要打电话给
python的内部质量为CTYPE-也许整个代码对象需要
被替换?当get()函数为时,甚至有可能这样做吗
即将返回此新代码对象?
干杯,
- 彼得

# 回答1


彼得·沃勒(Peter Waller)写道:
好吧,如果您真的只是出于好奇,那应该是
足以告诉您这是不可能的.
为什么不起作用的答案在于拆卸
功能:
0 load_const 0(0)
3 Store_fast 0(0)
6 load_global 1(1)
9 load_const 1(1)
12 call_function 1
15 pop_top
16 load_fast 0(0)< - 这是一个
19 print_item
20 print_newline
21 load_global 1(1)
24 load_const 2(2)
27 call_function 1
30 pop_top
31 load_global 2(2)< - 这是b
34 print_item
35 print_newline
36 LOAD_CONST 0(0)
39 return_value
由于您对名称A有作业,因此A被公认为是本地
编译时间的名称. b在编译中不公认为本地名称
时间,因此,即使您将B值注入当地人词典中,
字节代码仍然将值查找为全局名称.
并非没有对Python本身进行根本性更改. FA ct
在我看来,这是不可能的.我喜欢我
可以调用功能,并且 *绝对确定 *
污染我当地的名称空间.
希望这可以帮助,
- -
Carsten Haese http://informixdb.sourceforge.net
# 回答2


在9月12日,2:30*下午,Carsten Haese 这让我想问:是否很难修改函数的
代码?即使在执行功能时不可能
(因为那样我将返回刚刚创建的函数,我
猜猜吗?
load_fast?
我同意一般来说,功能应该没有副作用,我
想确切地知道它将要做什么,而我该怎么办
做是个性的.
我的好奇心扩大了,因为我想了解更多
关于Python的内部.我的肠道告诉我必须有一种方法
实现我追求的目标 - 即使结果非常丑陋.
也许它可能涉及将装饰器应用于使用此功能的功能
功能,谁更改代码以使这些调用有效?
为您的答复加油
- 皮特
# 回答3


在9月13日,1:35*PM,Peter Waller 不,这并不困难.查看byteplay模块:
它使各种肮脏的骇客成为可能.
# 回答4


您为什么不使用导入和__import __()? - 他们似乎是为这样的
应用.
我的意思是,我不反对恶性骇客,因为他们没有
幻想他们所做的事情无法(很容易)实现其他方式.
欢呼,BB
彼得·沃勒(Peter Waller)写道:

标签: python

添加新评论