如何在外部模块中更改变量或函数的值?
我有一个我需要解析的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
的值。