回复:将模块导入命名空间的函数

特里·里迪(Terry Reedy)写道:


['formatter','template','_templatemetaclass','__ builtins__',

我认为这在工作....首先,2个模块文件:
funcs.py
def func1():
打印"我是func1在funcs.py中"
更多
def func2():
打印"我是func2在'more.py'中"
和我出色的主要计划:
xx.py
进口功能
def addnewfuncs(p):
x = __ Import __(p)
funcs .__ dict __.更新(x .__ dict __)
funcs.func1()
addNewFuncs('More')
funcs.func2()
我遇到的第一个问题是进口以接受变量.它
似乎没有,所以我使用了__import __().然后,我不得不记得
将其分配给变量...然后看起来正常.
我错过了什么吗???
感谢指针!
鲍勃.

# 回答1


在6月30日上午9:52,BVDP

['formatter','template','_templatemetaclass','__ builtins__',


我认为这在工作....首先,2个模块文件:
funcs.py
def func1():
打印"我是func1在funcs.py中"
更多
def func2():
打印"我是func2在'more.py'中"
和我出色的主要计划:
xx.py
进口功能
def addnewfuncs(p):
x = __ Import __(p)
funcs .__ dict __.更新(x .__ dict __)
funcs.func1()
addNewFuncs('More')
funcs.func2()
我遇到的第一个问题是进口以接受变量.它
似乎没有,所以我使用了__import __().然后,我不得不记得
将其分配给变量...然后看起来正常.
我错过了什么吗???
您正在使用" More"模块中的 *所有内容 *,而不仅仅是
功能.这包括__name__,__doc__,__file__等内容.
可能具有有趣的副作用.
一个快速的愚蠢问题:你为什么要这样做?
对不起, *两个 *快速愚蠢的问题:是您的附加模块
控制,还是您希望能够使用任意模块进行此操作?
[如果在您控制的情况下,您可以坚持认为此类模块有一个
__ all__属性具有适当的内容]
第三:为什么要导入现有名称空间?现在
您知道__import__,为什么不调用函数
他们是?
干杯,
约翰

# 回答2


约翰·马奇(John Machin)写道:

好问题.简短的答案...可能是因为我没有想到
虽然完全有问题:)
我正在写一个"简单"的宏扩展器.我有一些主机代码
读取输入文件,解析宏并扩展它们.所以,在我的
输入文件我可能有类似的内容:
fjas j kj sdklj sdkl jfsdkl [某个地方的链接]
因此,我需要一个函数链接()来评估和返回" http:// ...."
而不是将link()之类的函数放在我的主线中,而是将它们粘在一个
自己的模块.在主线我
进口功能
然后,当我需要扩展时,我有以下代码:
如果不是cmd,则在var(funcs)中:
错误("未知函数/变量'%s'"%cmd)
如果类型(vars(funcs)[cmd])==类型(parse):
txt = eval(""" funcs.%s("%s")""%(cmd,arg)
else:#不是弹性,只需扩展变量
如果AR G:
错误("参数到变量'%s'不允许."%cmd)
txt = str(eval("funcs.%s"%cmd))
当然,问题出现了...如果用户(可能是我)想要
添加更多功能?我想很容易编辑funcs.py,但是
我认为使用更多模块会很好.
因此,我想,而不是将2nary模块的内容添加到
默认的" funcs.py"我也可以看一下
在我导入的所有模块中所需的功能.
我为什么要这样做...以及如何?
是的,那可能会更干净(更安全).
谢谢.
# 回答3


在6月30日上午11:45,BVDP 我正在写一个"简单"的宏扩展器.我有一些主机代码
读取输入文件,解析宏并扩展它们.所以,在我的
输入文件我可能有类似的内容:
fjas j kj sdklj sdkl jfsdkl [某个地方的链接]
因此,我需要一个函数链接()来评估和返回" http:// ...."
而不是将link()之类的函数放在我的主线中,而是将它们粘在一个
自己的模块.
为什么?除了您的调用外,他们是否有其他用途
主线?
构建一个词典 *一次 *,而不是每次都想查看它.例如.
funcs_vars = vars(funcs)
.... 很久以后:
如果不是funcs_vars中的CMD:
您要费力地遇到麻烦的任何特殊原因
构建声明,对其进行编译并运行它,何时可以
简单地做:
txt = funcs_vars [cmd](arg)
?
txt = str(funcs_vars [cmd])
您可能已经拥有的模块超出了所需的方式.如果唯一的事情
额外功能的不同之处在于,它们是事后的想法,
然后将它们与其他模块放在相同的模块中.
对我来说,听起来很不必要,效率低下且毫无意义.
我为什么要这样做...以及如何?
原因:因此,您只附加了想要到目标的功能
名称空间,不要导入__ -Name__之类的内容.方式:阅读
__全部__.只需附加______中列出的内容即可.但是
听起来您已经看过光,不会做任何事情
附加到名称空间.
是的,那可能会更干净(更安全).
更清洁,更安全的等只是要进口,甚至没有一个
完全单独的模块.
hth,
约翰
# 回答4


约翰·马奇(John Machin)写道:
我正在写一个"简单"的宏扩展器.我有一些主机代码可以阅读输入文件,解析宏并扩展它们.因此,在MyInput文件中,我可能有类似的内容:a fjas j kj sdklj sdkl jfsdkl [link where wordyext]因此,我需要一个function link()来评估和返回" http:// ..像我的主线中的link()一样,我将它们粘在自己的Amodule中.

为什么?除了您的调用外,他们是否有其他用途
主线?
构建一个词典 *一次 *,而不是每次都想查看它.例如.
funcs_vars = vars(funcs)
... 很久以后:
如果不是funcs_vars中的CMD:
您要费力地遇到麻烦的任何特殊原因
建立声明,编译它,然后 运行它,什么时候可以 简单地做: txt = funcs_vars [cmd](arg) ? txt = str(funcs_vars [cmd]) 您可能已经拥有的模块超出了所需的方式. 如果唯一的事情 额外功能的不同之处在于,它们是事后的想法, 然后将它们与其他模块放在相同的模块中. 对我来说,听起来很不必要,效率低下且毫无意义. 我为什么要这样做...以及如何? 原因:因此,您只附加了想要到目标的功能 名称空间,不要导入__ -Name__之类的内容. 方式:阅读 __全部__. 只需附加______中列出的内容即可. 但是 听起来您已经看过光,不会做任何事情 附加到名称空间. 是的,那可能会更干净(更安全). 更清洁,更安全的等只是要进口,甚至没有一个 完全单独的模块. hth, 约翰 谢谢. 这里有很多思考的食物. 让我消化,看看会发生什么 一切.

标签: python

添加新评论