Gaukite įspėjamuosius pėdsakus

Mespy, mes galime padaryti np.seterr(invalid='raise') kad gautumėte įspėjimą apie įspėjimus, kuriuose įvyko klaida (žr. Šį įrašą ).

  • Ar yra bendras būdas stebėti įspėjimus?
  • Ar galiu gauti python atsekti, kai atsiranda įspėjimas?
29
13 марта '14 в 12:16 2014-03-13 12:16 yra nustatytas kovo 13 d . 14, 12:16 2014-03-13 12:16
@ 2 atsakymai

Galite gauti tai, ko norite, priskirdami warnings.showwarning . Pati įspėjimo modulio dokumentacija rekomenduoja tai padaryti, todėl tai nereiškia, kad jus vilioja tamsiai šaltinio pusė. :)

Šią funkciją galite pakeisti alternatyviu diegimu, priskirdami warnings.showwarning .

Galite nustatyti naują funkciją, kuri daro tai, ką warning.showwarning . Tada įdėkite jį į originalą:

 import traceback import warnings import sys def warn_with_traceback(message, category, filename, lineno, file=None, line=None): log = file if hasattr(file,'write') else sys.stderr traceback.print_stack(file=log) log.write(warnings.formatwarning(message, category, filename, lineno, line)) warnings.showwarning = warn_with_traceback 

Po to kiekvienas įspėjimas spausdins kamino pėdsaką ir įspėjimo pranešimą. Tačiau atkreipkite dėmesį, kad jei įspėjimas ignoruojamas, nes tai nėra pirmasis, nieko nebus, todėl jūs vis dar turite daryti:

 warnings.simplefilter("always") 

Jūs galite gauti panašų valdymą, kurį atlieka vienas numpy.seterr naudodamas warning modulio filtrus

Jei norite, kad python praneštų apie kiekvieną įspėjimą kiekvieną kartą, kai jis prasideda, o ne tik pirmą kartą, galite įtraukti kažką panašaus:

 import warnings warnings.simplefilter("always") 

Jūs galite gauti kitokį elgesį, perduodami skirtingas eilutes kaip argumentus. Naudodami tą pačią funkciją, taip pat galite nurodyti skirtingus elgsenos tipus įspėjimams, priklausomai nuo modulio, kuris juos iškėlė, pranešimus, kuriuos jie pateikia, įspėjimo klasę, kodą vadinančius kodus ir tt

Galite patikrinti dokumentacijos sąrašą.

Pavyzdžiui, galite nustatyti visus įspėjimus, susijusius su išimčių DeprecationWarnings , išskyrus „ DeprecationWarnings , kurie turėtų būti visiškai ignoruojami:

 import warnings warnings.simplefilter("error") warnings.simplefilter("ignore", DeprecationWarning) 

Tokiu būdu, jūs gausite visą pėdsaką kiekvienam įspėjimui, kuris bus iškeltas kaip klaida (tik pirmasis, nes vykdymas bus sustabdytas ... bet jūs galite juos nukreipti po vieną ir sukurti filtrą, kad ignoruotumėte tuos, kuriuos nenorite išgirsti iš naujo. .

29
13 марта '14 в 13:45 2014-03-13 13:45 atsakymą pateikė „ mgab “ kovo 13 d. 14 d. 13:45 2014-03-13 13:45

Paleiskite, pavyzdžiui, programą

 python -W error myprogram.py 

Dėl to visi įspėjimai tampa mirtini, daugiau informacijos rasite čia .

12
13 марта '14 в 12:20 2014-03-13 12:20 Jakobo Bowyerio atsakymas kovo 13 d. 14 val. 12:20 2014-03-13 12:20

Žr. Kitus klausimus apie apie arba užduokite klausimą