如何在外部模块中更改变量或函数的值?

我有一个我需要解析的C ++头文件。我正在使用CppHeaderParser。可悲的是,标头会产生很多我想抑制的警告。有问题的标题由其他人维护,因此我不能仅仅解决它并完成它。

CppHeaderParser不包括抑制警告的可配置方式,但是由模块中的变量和函数控制

# Controls warning_print
print_warnings = 1

...

def warning_print(arg):
    if print_warnings: print(("[%4d] %s"%(inspect.currentframe().f_back.f_lineno, arg)))


在我的脚本中,我尝试更改print_warnings的值:

import CppHeaderParser
CppHeaderParser.print_warnings = 0
cpp_info = CppHeaderParser.CppHeader(my_h_file)


但这没有效果。
如何在其他模块中设置变量,以便该模块中定义的类可以看到它?

就我而言,我可能还想重新定义warning_print来检查警告,并仅跳过希望忽略的特定警告。我遇到了与设置print_warnings相同的问题。分配“有效”但没有效果,好像CppHeaderParser中的代码没有查看我设置的值。

注意:我通过临时创建头文件副本来解决此问题,并纠正了问题,但是我认为这是一个脆弱的解决方案。

更新:我能够通过以下方式完全,智能地取消所有警告:

CppHeaderParser.CppHeaderParser.print_warnings = 0

最佳答案

我已经看过源了。您的方法存在的问题是CppHeaderParser文件中带有*的导入:

from .CppHeaderParser import *


因此,您需要更改导入CppHeaderParser类的方式:

from CppHeaderParser import CppHeaderParser


它应该工作。

最后,只需尝试以下操作:

from CppHeaderParser import CppHeaderParser
CppHeaderParser.print_warnings = 0
cpp_info = CppHeaderParser.CppHeader(my_h_file)


出现这种现象的原因是from语句从导入的模块创建变量的副本,而不是别名。我将尝试通过一个简单的示例对其进行解释。假设我们有一个名为import_test的模块,其内容如下:

foo = "Init value"

def f():
    print(foo)


然后执行以下代码:

>> from import_test import *
>> f()
Init value
>> foo = "Updated value"
>> f()
Init value


原因是您更改了变量foo的副本,因此import_test.foo变量的实际值不变。

但是,当我们导入模块本身时,我们会有不同的行为:

>> import import_test
>> import_test.f()
Init value
>> import_test.foo = "Updated value"
>> import_test.f()
Updated value


因此,对于CppHeaderParser包,当您制作import CppHeaderParser时,将执行CppHeaderParser.__init__中的代码。 python解释器在CppHeaderParser中创建warnings_print变量的副本。但是要更改print_warning函数的行为,您必须更改CppHeaderParser.CppHeaderParser.warnings_print的值。

09-25 21:18