通过导入模块中的exec动态定义函数

大家好,
我正在尝试编写一个将动态生成其他的函数
通过exec的功能.然后,我希望能够导入文件(模块)
包含此功能并将其用于其他模块,但对于某些模块
原因仅使用"导入"语法而不是从中起作用,而不是从
动态生成,但无法从导入模块访问.
关于我能做什么才能保留第二种形式的任何想法
导入并且仍然可以看到执行功能吗?
这是代码...我有三个文件:
#####################################
#moda.py
Def DynamicDef(名称,AMT):
''''用给定名称动态定义一个新功能
添加
给定的论点并返回结果.'''
stm =" def%s(x):\ n \ tretern x +%d"%(name,amt)
打印STM
#执行STM#---随之而来的"名称"仅在内部访问
这个fn
Globals()#----这使其在此内进行全局
模块...
打印评估(名称)
DynamicDef('plus5',5)
PRINT PLUS5(7)
#####################################
#modb.py
#这使用DynamicDef动态定义新功能,并且

#正常工作,新定义的功能可通过
moda
# 模块...
导入moda
moda.dynamicdef('plus10',10)
打印帮助(moda.plus5)
打印帮助(moda.plus10)
打印moda.plus5(20)
打印moda.plus10(20)
#####################################
#modc.py
#这使用DynamicDef动态定义一个新功能,但是

#不起作用;似乎对新定义的功能的了解

#moda模块没有传播回到此上下文或其他...?
从Moda Import *
DynamicDef('plus10',10)
打印帮助(加5)
#print帮助(Plus10)#!失败:名称:名称" plus10"不是
定义
Print Plus5(20)
PRINT PLUS10(20)
#####################################
感谢您的任何帮助/建议,
---纳德姆

# 回答1


8月15日,7:26*pm,nadeem 一般提示:每当您认为需要使用Exec(或评估)时,99%
你没有的时间;大多数时候有更好的(意思是,更少
脆弱和晦涩的解决方案.
毫不奇怪,确实有一种更好的方法,一个封闭:
Def Adder(AMT):
def闭合(x):
返回X + AMT
返回关闭
12
hth,
乔治
# 回答2


我了解99%的规则...我给出的例子是简化
问题.我正在处理的完整工作是介绍性的图书馆
我在教书的CS课.本质上,我正在尝试建立一个库
宏供学生使用允许他们定义记录的宏(例如
c)具有选择器函数的结构.特别是我想
复制Python中HTDP项目中的一些方案内容
(http://www.htdp.org/2003-09-26/book/curriculum-z--
H-9.HTML#NODE_SEC_6.3).我想提供一个函数,称为
称为这样的定义:
defenstruct('pos','x','y')
该功能的效果将是动态定义几个新的
功能 与结构合作的离子:
makepos(x,y)
POSX(P)
posy(p)
ISPO(P)
我了解所有这些都可以通过课程和oo来完成
编程,但是HTDP课程的全部要点是
向学生介绍以教学有效的方式进行编程
使用功能方法而不是OO-First.他们在计划中做到
这主要是F.P.语言,我正在尝试复制
Python中的类似方法.定义的事物基本上是指
成为一个宏来引入一组功能
结构定义是需要的.
因此,由于这些原因,我不认为上面的封闭示例是
有帮助.我不想告诉学生有关
关闭,当然让他们担心功能返回
功能和功能指针等.我正在尝试捆绑所有这些
在幕后.
因此,再次考虑我的问题,可能是:
在模块中调用的函数中,可以访问和更新
呼叫者模块中的全局定义(字典或其他).
---纳德姆
# 回答3


好吧,我发现一个似乎通过访问
Globals()最外面堆栈框架的字典并添加了一个条目
它用于新创建的功能:
进口检查
Def DynamicDef(名称,AMT):
''''用给定名称动态定义一个新功能
添加
给定的论点并返回结果.'''
stm =" def%s(x):\ n \ tretern x +%d"%(name,amt)
打印STM
Globals()中的Exec Stm
##将其添加为将新功能名称导出到顶级...
Inspect.stack()[ - 1] [0] .f_globals [name] = eval(name)
我想除非有人建议替代,否则我会选择这一点.谢谢
反正, :)
---纳德姆
# 回答4


在2008年8月15日星期五,晚上10:48,nadeem def defenstruct(名称, *参数):
_ struct class:
def __init __(self, *init_parameters):
对于pname,zip中的pvalue(参数,init_parameters):
setAttr(self,pname,pvalue)
globals()[" make" + name] = _ struct
对于参数中的参数:
def getter(o,参数=参数):
返回getAttr(o,参数)
Globals()[名称 +参数] = Getter
globals()["是" +名称] = lambda o:isInstance(o,_struct)
当然,您可能会做其他事情,例如加强框架
sys._getFrame()将功能注入呼叫者全局范围.
您也可以进行一些明显的优化以及
您可能需要添加其他"方法".
- -
阅读我的博客!我依靠您接受我的意见!我有兴趣! http://techblog.ironfroggy.com/
如果您喜欢这样的事情,请跟随我:http://www.twitter.com/irinfroggy
# 回答5


这是一种非常整洁的方式,非常感谢!我没有意识到
所有这些全球词典的访问程度如何.猜猜我的例子
仍然落在99%... :)
---纳德姆
- -
阅读我的博客!我依靠您接受我的意见!我很有趣!http://techblog.ironfroggy.com/
跟随 我如果您喜欢这种事情:http://www.twitter.com/irinfroggy
# 回答6


8月16日,4:48*am,nadeem Raymond Hetting的命名tuple食谱
到底是,猜猜是什么,它使用了执行!
也是标准库中的医生模块
使用执行效果很好.所以,我会说是
不是99%的规则,假设这是98%的规则;)
顺便说一句,我还写了一篇关于命名的论文
我将很快或以后翻译
(目前有Google Translator):http://stacktrace.it/articoli/2008/0...cord-python-1/
纸,就像名为Tuple的食谱一样,
具有强大的功能偏见,因此可能引起人们的关注
给来自计划的人.
Michele Simionato
# 回答7


8月16日,12:50*AM,Michele Simionato
写道:
Raymond Hetting的命名tuple食谱
到底是,猜猜是什么,它使用了执行!
我可能错了,但是名为tuple使用Exec的原因是性能.
IIRC早期版本的食谱使用了元类,所以它是
并不是说 *使用exec,它只是一个优化,完全
在这种情况下是合理的
普通的元组.
乔治
# 回答8


纳德姆写道:
然而,HTDP的一位作者刚刚发布了一篇论文,认为
是时候放弃"编程语言范式"的整个想法了
在教学中,并专注于语言特征.
大多数书籍都严格遵守神圣的语言划分
进入"功能","命令","面向对象"和"逻辑"
营地.我猜想对分类学的渴望是人工制品
从我们学科初期开始的科学态度:
误导了遵循科学实践而不是
它的精神.但是,我们是一门艺术的科学.什么
其他要制作诸如Python,Ruby或Perl之类的语言?他们的
设计师对这些linnaean的优美没有耐心
层次结构;他们按照自己的意愿借用功能
这种完全反抗的特征.我们如何教PL
后时代? http://www.cs.brown.edu/~sk/publicat...post-linnaean/
好吧,他的重点是教授编程语言 *设计 *
功能(而且仍然有"方案都是正确的"的通常语气
时间和其他人一直在犯错",尽管最近有RS6
Brouhaha ;-),但我想说您应该三思而后行.
学生在一种语言的模型中荒谬的人工渲染
另一种语言的语法.展示Python的方法是微不足道的
*语法*用于将普通函数与"属性"相关联
容器"无需首先将OO作为正式概念.
# 回答9


LE 2008年8月16日星期六06:50:02 Michele Simionato,VousAvezécrit*:
Raymond Hetting的命名tuple食谱
到底是,猜猜是什么,它使用了执行!
它使用执行,但不能,而IMO不应该,所有的烹饪都可能是
完成了 n关闭.我加入它的版本没有Exec.当然是唯一的
缺点是您需要在__new__和
不能依靠动态编译的Arglist.但这是一个常见的成语
思考.
是的,但是在Doctest中,Exec用于用于使用的意图,执行
用户提供的任意代码,这是exec的合法和完美使用
因为这里的用户是一个受信任的人(程序员本人).
我会说,在应用程序/函数/lib中使用Exec/Eval的任何地方
并不意味着解释任意和用户提供的Python代码,这是一个
不良用法.
- -
_____________
Maric Michaud
# 回答10


8月16日,3:25*下午,乔治·萨基斯(George Sakkis)<乔治·萨克(George.Sak)...
我可能错了,但是名为tuple使用Exec的原因是性能.
IIRC早期版本的食谱使用了元类,所以它是
并不是说 *使用exec,它只是一个优化,完全
在这种情况下是合理的
普通的元组.
我一直认为"执行"的原因是在
名为Tuple构造函数.我没有
不过,测量性能.
# 回答11


8月16日,4:02*PM,Maric Michaud 问题是,有些事情你不能没有
exec/eval:例如,查看实现
我自己的装饰器模块,该模块使用评估
确保装饰功能的良好签名.
可能没有执行
字节码hacks,但我认为与字节码一起摆弄
比执行本身还差.我不是
确定是否在Python 3.0中,签名对象为
有足够的功能来完成这项工作,我从来不必
是时候检查它的工作方式了.
Michele Simionato

标签: python

添加新评论