我有一个需要解析的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
答案 0 :(得分:2)
我看过来源了。您的方法的问题是在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
的值。
答案 1 :(得分:0)
尝试修补猴子:
import CppHeaderParser
def my_silent_warning_print(arg):
pass
CppHeaderParser.warning_print = my_silent_warning_print