2010-02-02 13 views
22

Bir doğrulayıcıda birçok uyarı gönderiyorum ve warnings.warn() ürününe verilen ileti dışında stdout'taki her şeyi bastırmak istiyorum.Python: Sadece uyarılarda bulunan iletiyi yazdır

Yani, şimdi bu bkz:

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

Bunu görmek istiyorum:

My looong warning message 

Düzenleme 2:

def _warning(
    message, 
    category = UserWarning, 
    filename = '', 
    lineno = -1): 
    print(message) 
... 
warnings.showwarning = _warning 
warnings.warn('foo') 
:
geçersiz kılma warnings.showwarning() işten çıktı Kendi özel işlevinizle

cevap

13

Monkeypatch warnings.showwarning() iyon.

+5

Bağlantıyı okudunuz mu? Ve şunu da alıntıyorum: "Bu işlevi, warnings.showwarning'e atayarak alternatif bir uygulama ile değiştirebilirsiniz." Kılavuz * kendisi * modülü maymun uygulamanızı önerir. –

+0

endişelenmeyin, tamamen normal python prosedürüdür, hiç de sert değildir. Python üzerinde –

12

her zaman vardır monkeypatching edilir:

import warnings 

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

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

3.6 TypeError alıyorum: custom_formatwarning() beklenmedik bir anahtar kelime argümanı 'line' var. Bu yüzden fonksiyon imzasını şu şekilde değiştirdim: 'def custom_formatwarning (mesaj, kategori, dosya adı, lineno, satır = '')' –

+0

Python 3.6'da "aynı beklenmedik bir anahtar kelime argümanı 'satırı'" vardı ama imzayı değiştirdim. custom_formatwarning komutunu (msg, * a, ** b): 'bu yüzden anahtar kelime arkılarını da yakalar. – SuperGeo

6

logging module yerine warnings arasında kullanın.

+0

Bu, ilk başta 'uyarıları 'kullanmaya çalıştığım durumların büyük çoğunluğuna ulaştığım şey. Eğer uyarılar ile uğraşıyorsanız, bu seçeneği göz önünde bulundurmalısınız. Ciddi anlamda. – tripleee

6

sadece kaynak kod satırını atlamak için ne yapıyorum. Bu, belgelerin önerdiği gibi büyüktür, fakat tam olarak neyin değişeceğini anlamaya çalışmak biraz zor olmuştur. (Özellikle, showwarnings dışında kaynak hattını tutmak için çeşitli şekillerde denedik ama istediğim şekilde çalışmak için alamadım.)

# 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='') 

Sadece line=None geçen Python için filename ve lineno kullanmasına neden olur automagically line için bir değer bulmak, ancak bunun yerine boş bir dize iletir.

+0

Bunun çok yaşlı olduğunu biliyorum ama benzer bir şey yaptım ve bu da işe yaradı. Ancak bunu bir işlev içinde yaparsam, uyarı davranışı genel kapsamda değişir. Her uyarı, bu işlev çağrıldıktan sonra değiştirilmiş davranışı benimser. Etkisini sınırlamanın bir yolunu biliyor musun? – percusse

+0

Hmm, Bunu yalnızca genel bağlamda kullandım. Garip bir çözüm olarak, 'line' değerinin geçersiz olup olmadığına karar vermek için' lambda' içinde kullanılan global bir değişken tanımlayabilirsiniz. (Bu noktada, belki "lambda" yerine adlandırılmış bir işlev kullanın?) – tripleee

+0

Maalesef bu şeyleri nerede yaptığımın önemi yoktu. Ayrıca orijinal defeinition kaydetmeyi ve geri yüklemeyi denedim ama henüz boşuna değil. – percusse

İlgili konular