簡體   English   中英

如何抑制Python模塊CppHeaderParser中的警告

[英]How Can I Suppress Warnings in Python Module CppHeaderParser

如何在外部模塊中更改變量或函數的值?

我有一個我需要解析的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_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的值。

嘗試猴子修補:

import CppHeaderParser

def my_silent_warning_print(arg):
    pass

CppHeaderParser.warning_print = my_silent_warning_print

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM