Re: [Python-de] Debug-Ausgabe
Stefan Schwarzer wrote:
[…] Thomas 'PointedEars' Lahn wrote:
[X-Post & F'up2 de.comp.lang.python]
Mir fehlt in diesem Posting relativ viel vom Kontext, deshalb kann es sein, dass ich auf Sachen eingehe, die schon erledigt sind.
Ich habe so vollständig wie technisch möglich zitiert. Den übrigen Kontext kannst Du den Referenzen (“References”-Headerfeld) entnehmen. Dies zu tun, ist bei einem Crosspost (X-Post) ratsam.
Du schriebst am Wed, 17 Dec 2014 13:17:19 +0100: Lies und beherzige bitte <http://einklich.net/usenet/zitier>.
Auf welchen der Punkte dort beziehst du dich in diesem Kontext? :)
Du möchtest Dich nicht dummstellen, vertrau mir.
Ist es und tut es aber. Ich benutze z.B. gerne für "transiente" Ausgaben (für Tests und zum Prüfen) vollständig ausgerückte Ausgabe-Statements (die also ab Spalte 1 stehen). Das fällt bei einem einigermaßen ... _Geht_ in Python _nicht_.
debug = True
if debug: statement1 statement2
Also, das geht in Python schon
Es ging hier darum, „mal eben“ Debug-Anweisungen einzufügen. Das geht in Python tatsächlich auf diese Weise nicht, weil die Einrückung eine Rolle spielt. Die Anweisungen beginnen daher nicht notwendigerweise in Spalte 1.
und ich finde es, je nachdem, was man untersucht, auch in Ordnung.
Für triviales Debugging mag das ausreichen. Sobald aber Debug-Level hinzukommen oder – das war hier der Anwendungsfall – tiefere Codeebenen berücksichtigt werden müssen, wird es unübersichtlich und schwierig wartbar.
Diesen Ansatz empfehle ich auch für andere Programmiersprachen – optimal natürlich als Präprozessor-Makro. Daher stellt sich das Problem erst gar nicht:
from sys import stderr
debug_level=2
def dmsg (*args, **kwargs): if getattr(kwargs, 'min_level', None) is None:
Da `kwargs` ein Mapping ist,
Es ist eine dict-Instanz: ,---- | >>> def foo (*args, **kwargs): | ... print(type(kwargs)) | ... | >>> foo() | <class 'dict'> | >>> foo(bla='baz') | <class 'dict'> | >>> `----
meintest du wahrscheinlich
if kwargs.pop('min_level', None) is None:
Nein, ich meinte was ich schrieb.
kwargs['min_level'] = 1
Zusammengefasst, also inklusive des `if`, könnte man das übrigens auch als
kwargs.setdefault('min_level', 1)
schreiben. :-)
Ja: | >>> print(({}).setdefault.__doc__) | D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D | >>> Danke.
An sich würde ich aber gar nicht `kwargs` modifizieren, sondern den Wert herausziehen:
min_level = kwargs.pop('min_level', 1)
Das modifiziert `kwargs' ebenfalls: | >>> print(({}).pop.__doc__) | D.pop(k[,d]) -> v, remove specified key and return the corresponding | value. If key is not found, d is returned if given, otherwise KeyError | is raised | >>>
und dann `min_level` weiterverwenden. Dann
Deshalb:
brauchst du weiter unten auch das `del` nicht.
Ja, das ist eleganter. Danke. -- PointedEars Twitter: @PointedEars2 Please do not cc me. / Bitte keine Kopien per E-Mail.
Hallo Thomas, On 2014-12-21 11:44, Thomas 'PointedEars' Lahn wrote:
Stefan Schwarzer wrote:
[…] Thomas 'PointedEars' Lahn wrote:
[X-Post & F'up2 de.comp.lang.python]
Du schriebst am Wed, 17 Dec 2014 13:17:19 +0100: Lies und beherzige bitte <http://einklich.net/usenet/zitier>.
Auf welchen der Punkte dort beziehst du dich in diesem Kontext? :)
Du möchtest Dich nicht dummstellen, vertrau mir.
Die Frage war ernst gemeint.
Ist es und tut es aber. Ich benutze z.B. gerne für "transiente" Ausgaben (für Tests und zum Prüfen) vollständig ausgerückte Ausgabe-Statements (die also ab Spalte 1 stehen). Das fällt bei einem einigermaßen ... _Geht_ in Python _nicht_.
debug = True
if debug: statement1 statement2
Also, das geht in Python schon
Es ging hier darum, „mal eben“ Debug-Anweisungen einzufügen. Das geht in Python tatsächlich auf diese Weise nicht, weil die Einrückung eine Rolle spielt. Die Anweisungen beginnen daher nicht notwendigerweise in Spalte 1.
Aber der Ansatz lässt sich doch auf beliebige Einrückungen übertragen?
und ich finde es, je nachdem, was man untersucht, auch in Ordnung.
Für triviales Debugging mag das ausreichen. Sobald aber Debug-Level hinzukommen oder – das war hier der Anwendungsfall – tiefere Codeebenen berücksichtigt werden müssen, wird es unübersichtlich und schwierig wartbar.
Na ja, Ad-hoc-Debug-Ausgaben entfernt man bald wieder, so gesehen müssen die nicht unbedingt "wartbar" sein, finde ich. Anders sieht es bei längerfristig angelegtem Logging aus.
Diesen Ansatz empfehle ich auch für andere Programmiersprachen – optimal natürlich als Präprozessor-Makro. Daher stellt sich das Problem erst gar nicht:
from sys import stderr
debug_level=2
def dmsg (*args, **kwargs): if getattr(kwargs, 'min_level', None) is None:
Da `kwargs` ein Mapping ist,
Es ist eine dict-Instanz:
Genau. :)
,---- | >>> def foo (*args, **kwargs): | ... print(type(kwargs)) | ... | >>> foo() | <class 'dict'> | >>> foo(bla='baz') | <class 'dict'> | >>> `----
Ich meinte "Mapping" als Oberbegriff, so wie Strings oder Listen auch als "Sequenzen" bezeichnet werden.
meintest du wahrscheinlich
if kwargs.pop('min_level', None) is None:
Nein, ich meinte was ich schrieb.
Wenn du `**kwargs` benutzt und an ein Keyword-Argument willst, musst du auf einen Key zugreifen, nicht auf ein Attribut:
d = dict(a=1)
d.a Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'dict' object has no attribute 'a' d["a"] 1
getattr(d, "a") Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'dict' object has no attribute 'a' d.pop("a") 1 d {}
An sich würde ich aber gar nicht `kwargs` modifizieren, sondern den Wert herausziehen:
min_level = kwargs.pop('min_level', 1)
Das modifiziert `kwargs' ebenfalls:
| >>> print(({}).pop.__doc__) | D.pop(k[,d]) -> v, remove specified key and return the corresponding | value. If key is not found, d is returned if given, otherwise KeyError | is raised | >>>
Klar, was aber in dem Fall beabsichtigt war. :-) Viele Grüße Stefan
Hallo Stefan, Am 21.12.2014 um 12:37 schrieb Stefan Schwarzer:
> Ist es und tut es aber. Ich benutze z.B. gerne für "transiente" > >>>>>> Ausgaben (für Tests und zum Prüfen) vollständig ausgerückte > >>>>>> Ausgabe-Statements (die also ab Spalte 1 stehen). Das fällt bei einem > >>>>>> einigermaßen >>> ... > >>>>>> _Geht_ in Python _nicht_. >>>>> >>>>> debug = True >>>>> >>>>> if debug: >>>>> statement1 >>>>> statement2
Also, das geht in Python schon
Es ging hier darum, „mal eben“ Debug-Anweisungen einzufügen. Das geht in Python tatsächlich auf diese Weise nicht, weil die Einrückung eine Rolle spielt. Die Anweisungen beginnen daher nicht notwendigerweise in Spalte 1. Aber der Ansatz lässt sich doch auf beliebige Einrückungen übertragen?
So wie ich das lese, will der ursprüngliche Poster das aber in der 1. Spalte stehen haben. Siehe den Beginn des Teiles, den ich zitiert habe, (Ich musste das allerdings auch erstmal *genau* lesen, damit mir das klar wurde.) -- Schönen Gruß Hartmut Goebel Dipl.-Informatiker (univ), CISSP, CSSLP Information Security Management, Security Governance, Secure Software Development Goebel Consult, Landshut http://www.goebel-consult.de Blog: http://www.goebel-consult.de/blog/eine-millonen-aufkleber-fordern-asyl-fur-s... Kolumne: http://www.cissp-gefluester.de/2010-01-hinterturen-allen-ortes Goebel Consult ist Mitglied bei http://www.7-it.de/
Hi, On 2014-12-21 12:37, Stefan Schwarzer wrote:
An sich würde ich aber gar nicht `kwargs` modifizieren, sondern den Wert herausziehen:
min_level = kwargs.pop('min_level', 1)
Das modifiziert `kwargs' ebenfalls: [...]
sorry, hier habe ich mir in der Tat selbst widersprochen. Als ich das schrieb, hatte ich im Sinn, `min_level` als Keyword-Argument mit Default zu verwenden und gar nicht in `kwargs` unterzubringen, aber das geht in Kombination mit `**kwargs` gerade nicht. Viele Grüße Stefan
participants (3)
-
Hartmut Goebel
-
Stefan Schwarzer
-
Thomas 'PointedEars' Lahn