我在使用另一个功能从另一个模块替换功能时遇到了麻烦,这让我发疯了.
假设我有一个模块bar.py,如下所示:
from a_package.baz import do_something_expensive
def a_function():
print do_something_expensive()
Run Code Online (Sandbox Code Playgroud)
我有另一个模块,看起来像这样:
from bar import a_function
a_function()
from a_package.baz import do_something_expensive
do_something_expensive = lambda: 'Something really cheap.'
a_function()
import a_package.baz
a_package.baz.do_something_expensive = lambda: 'Something really cheap.'
a_function()
Run Code Online (Sandbox Code Playgroud)
我希望得到结果:
Something expensive!
Something really cheap.
Something really cheap.
Run Code Online (Sandbox Code Playgroud)
但相反,我得到了这个:
Something expensive!
Something expensive!
Something expensive!
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
摘要: 我想使用“模块”类型的变量并将其导出。
我正在使用import从.py文件中导入 python模块并对其进行更改。我需要将模块导出回文件或获取完整模块的字符串表示形式,然后可以将其写入磁盘。
我一直找不到任何方法可以导出python模块,也无法将模块内的对象转换为结构化,纯文本python可执行格式的字符串。(不是json,腌制等)
详细的问题和用例: 此要求是内部构建过程的一部分;没有安全要求,仅修改了我们自己的模块,而不是内置模块。python脚本与业务逻辑一起运行以修改许多其他脚本。此过程使用仅在构建时可用的信息。结果,我无法选择在运行时导入具有不同数据的模块。
最初的系统使用了带有占位符字符串的模板,该模板将被替换,但是当前的要求要求对对象声明进行更复杂的修改,其中以编程方式修改对象比替换字符串要容易得多。
我所做的事情 使用python编写的主生成器脚本,我可以导入多个模块(它们只有变量声明,没有可执行代码),并进行所有需要的替换。我剩下一个模块类型的变量,我需要将其导出回文件以供以后执行。
@abarnert有一些好主意。我不知道repr功能。那给了我信息,但没有任何格式。这使我看到了pprint,它与到目前为止我所想要的接近。
示例 example.py
sample = {
'level1_dict_1' : {
'key1' : 'value1',
'key2' : {
'level2_dict' : {
'key1' : 'value3',
'key2' : ['list1','list2','list3','list4'],
}
}
},
'level1_dict_2' : {
'key1' : 'value1',
'key2' : 'value2',
},
}
Run Code Online (Sandbox Code Playgroud)
大大简化了(并且没有应用任何业务逻辑),我基本上想执行以下操作:
with open("example.py","w") as outfile:
example = __import__('example') # Import module
example.sample['level1_dict_1']['key2']['level2_dict']['key2'][2] = "newlistitem3" # Change 1 property in a list nested a few levels deep
outfile.write("sample = \n" …Run Code Online (Sandbox Code Playgroud)