2010-02-02 18 views
22

मैं एक वैधकर्ता में बहुत सारी चेतावनियां जारी कर रहा हूं, और warnings.warn() पर दिए गए संदेश को छोड़कर मैं स्टडआउट में सबकुछ दबाना चाहता हूं।पायथन: चेतावनियों पर केवल संदेश प्रिंट करें

Ie, अब मैं इस देखें:

./file.py:123: UserWarning: My looong warning message 
some Python code 

मैं इस देखना चाहते हैं:

My looong warning message 

संपादित करें 2:

def _warning(
    message, 
    category = UserWarning, 
    filename = '', 
    lineno = -1): 
    print(message) 
... 
warnings.showwarning = _warning 
warnings.warn('foo') 
:
अधिभावी warnings.showwarning() काम करने के लिए निकला

उत्तर

13

मोंकीपैच warnings.showwarning() अपने स्वयं के कस्टम फ़ंक्शन के साथ आयन।

+5

क्या आपने लिंक पढ़ा था? और मैं उद्धृत करता हूं: "आप इस फ़ंक्शन को चेतावनियों को निर्दिष्ट करके वैकल्पिक कार्यान्वयन के साथ प्रतिस्थापित कर सकते हैं। Showwarning।"। मैन्युअल * स्वयं * अनुशंसा करता है कि आप मॉड्यूल बंदरगाह करें। –

+0

चिंता न करें, यह बिल्कुल सामान्य पायथन प्रक्रिया है, बिल्कुल कठोर नहीं है। पाइथन 3.6 पर –

12

वहाँ हमेशा monkeypatching है:

import warnings 

def custom_formatwarning(msg, *a): 
    # ignore everything except the message 
    return str(msg) + '\n' 

warnings.formatwarning = custom_formatwarning 
warnings.warn("achtung") 
+0

मुझे टाइप एरर मिलता है: custom_formatwarning() को एक अप्रत्याशित कीवर्ड तर्क 'लाइन' मिला है। तो मैंने फ़ंक्शन हस्ताक्षर को इस प्रकार बदल दिया: 'def custom_formatwarning (संदेश, श्रेणी, फ़ाइल नाम, lineno, line =' ') ' –

+0

मुझे पाइथन 3.6 में" एक अप्रत्याशित कीवर्ड तर्क' पंक्ति 'मिली थी, लेकिन मैंने अभी हस्ताक्षर बदल दिया 'def कस्टम_formatwarning (msg, * ए, ** बी): 'तो यह कीवर्ड तर्क भी पकड़ता है। – SuperGeo

6

logging modulewarnings के बजाय का उपयोग करें।

+0

यही वह है जो मैंने उन अधिकांश स्थितियों में समाप्त कर दिया है जहां मैंने मूल रूप से 'चेतावनियों' का उपयोग करने की कोशिश की थी। यदि आप 'चेतावनियों' से जूझ रहे हैं, तो आपको इस विकल्प पर विचार करना चाहिए। गंभीरता से। – tripleee

6

यहां मैं को स्रोत कोड लाइन को छोड़ने के लिए क्या कर रहा हूं। यह दस्तावेज द्वारा सुझाए गए अनुसार बड़े पैमाने पर है, लेकिन यह पता लगाने के लिए एक संघर्ष था कि वास्तव में क्या बदला जाए। (विशेष रूप से, मैं विभिन्न तरीकों showwarnings से बाहर स्रोत लाइन रखने के लिए करने की कोशिश की, लेकिन यह जिस तरह से मैं चाहता था काम करने के लिए नहीं मिल सका।)

# Force warnings.warn() to omit the source code line in the message 
formatwarning_orig = warnings.formatwarning 
warnings.formatwarning = lambda message, category, filename, lineno, line=None: \ 
    formatwarning_orig(message, category, filename, lineno, line='') 

बस गुजर line=None अजगर को filename और lineno उपयोग करने के लिए कारण होगा line स्वचालित रूप से एक मान का आकलन करें, लेकिन इसके बजाय एक खाली स्ट्रिंग को पास करने से यह ठीक हो जाता है।

+0

मुझे पता है कि यह बहुत पुराना है लेकिन मैंने एक समान काम किया है और यह भी काम करता है। हालांकि अगर मैं इसे किसी फ़ंक्शन के अंदर करता हूं, तो चेतावनी व्यवहार वैश्विक दायरे में बदल जाता है। प्रत्येक चेतावनी कॉल करने के बाद आता है कि कार्य संशोधित व्यवहार को गोद ले। क्या आप इसके प्रभाव को सीमित करने का एक तरीका जानते हैं? – percusse

+0

हम्म, मैंने कभी भी इसे वैश्विक संदर्भ में उपयोग किया है। एक सनकी कामकाज के रूप में, आप एक वैश्विक वैरिएबल को परिभाषित कर सकते हैं जिसका उपयोग 'लैम्ब्डा' के अंदर किया जाता है ताकि यह तय किया जा सके कि 'line' मान ओवरराइड है या नहीं। (उस बिंदु पर, शायद 'lambda' की बजाय नामित फ़ंक्शन का उपयोग करें?) – tripleee

+0

दुर्भाग्यवश इससे कोई फर्क नहीं पड़ता कि मैंने इन चीजों को कहाँ किया था। मैंने मूल पराजय की बचत और बहाल करने की भी कोशिश की लेकिन अभी तक कोई फायदा नहीं हुआ। – percusse

संबंधित मुद्दे