相关疑难解决方法(0)

一个猴子如何在python中修补一个函数?

我在使用另一个功能从另一个模块替换功能时遇到了麻烦,这让我发疯了.

假设我有一个模块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)

我究竟做错了什么?

python monkeypatching

76
推荐指数
3
解决办法
4万
查看次数

导出python模块(到字符串或py文件)

摘要: 我想使用“模块”类型的变量并将其导出。

我正在使用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)

python

5
推荐指数
1
解决办法
3569
查看次数

标签 统计

python ×2

monkeypatching ×1