vscode - python pdb tutorial




print()-Methode zum buchstäblichen Drucken des übergebenen Ausdrucks zusammen mit der berechneten Ausgabe für ein schnelles Debuggen (6)

Im Allgemeinen denke ich, wenn Sie eval gibt es wahrscheinlich einen besseren Weg, um das zu tun, was Sie versuchen, aber:

for statement in ["42 + 42", "type(list)", "datetime.now()"]:
    print("{} : {}".format(statement, eval(statement))

Ich möchte in der Lage sein, Python-Debugging mit print () oder einer ähnlichen Methode durchzuführen, bei der der übergebene Ausdruck zusätzlich zur üblichen Ausgabe gedruckt wird.

Zum Beispiel für den folgenden Code:

print(42 + 42)
print(type(list))
print(datetime.now())

Aktueller Output:

84
<class 'type'>
2019-08-15 22:43:57.805861

Erwartete Ausgabe:

42 + 42 : 84
type(list) : <class 'type'>
datetime.now() : 2019-08-15 22:43:57.805861

Derzeit kann das Gleiche durch manuelles Hinzufügen des Ausdrucksstrings erreicht werden (nicht so elegant imho und verstößt gegen das DRY-Prinzip).

print("42 + 42 : ", 42 + 42)
print("type(list) : ", type(list))
print("datetime.now() : ", datetime.now())

Ich habe versucht, den eingebauten Druck zu überschreiben, aber ohne Erfolg:

import builtins
def print(*args, **kwargs):
    return builtins.print(*args, **kwargs)  # passed expression isn't available here as string!

Gibt es einen Weg, dies zu erreichen? Vielen Dank!


Sie können https://github.com/cool-RR/PySnooper

In [1]: from datetime import datetime                                                                                                                                                                                                         

In [2]: import pysnooper                                                                                                                                                                                                                      

In [3]: @pysnooper.snoop() 
   ...: def output(): 
   ...:     print(42 + 42) 
   ...:     print(type(list)) 
   ...:     print(datetime.now()) 
   ...:                                                                                                                                                                                                                                       

In [4]: output()                                                                                                                                                                                                                              
Source path:... <ipython-input-3-d5732f8e9c36>
22:14:08.934915 call         2 def output():
22:14:08.935031 line         3     print(42 + 42)
84
22:14:08.935061 line         4     print(type(list))
<class 'type'>
22:14:08.935083 line         5     print(datetime.now())
2019-08-25 22:14:08.935100
22:14:08.935109 return       5     print(datetime.now())
Return value:.. None

Sie können eine superprint Funktion definieren und diese drucken lassen und dann eine Zeichenfolge auswerten:

from datetime import datetime

def superprint(str):
    print(str," : ",eval(str))

a = "42 + 42"
b = "type(list)"
c = "datetime.now()"
superprint(a)
superprint(b)
superprint(c)

AUSGABE

42 + 42  :  84
type(list)  :  <class 'type'>
datetime.now()  :  2019-08-15 14:44:43.072780

Wenn Sie damit leben können, alles, was Sie drucken möchten, in Anführungszeichen zu setzen, könnte dies für Sie funktionieren.


Verwenden Sie Augusto Men's Answer als Grundlage und überschreiben Sie die in Python integrierte print () -Methode. Auf diese Weise können Sie das Debuggen durchführen, ohne dass Änderungen am zu testenden Code erforderlich sind. Fügen Sie diese Funktionsdefinition einfach zu einer beliebigen Datei hinzu, und es funktioniert.

from inspect import getframeinfo, currentframe
import builtins

def print(*args, **kwargs):
    info = getframeinfo(currentframe().f_back)
    label = ''.join(info.code_context).strip()
    label = label.replace('print(', '', 1)[:-1].strip()  # (optional)
    return builtins.print(label, ':', *args, **kwargs)

print(42 + 42)
print(type(list))
print(datetime.now())
print([i for i in range(5)])
if 1 < 2: print('True')

Ausgabe:

42 + 42 : 84
type(list) : <class 'type'>
datetime.now() : 2019-08-28 16:00:10.812306
[i for i in range(5)] : [0, 1, 2, 3, 4]
if 1 < 2: 'True' : True

Wenn Sie die Druckmethode aufrufen, werden übergebene Argumente nicht von der Druckmethode ausgewertet, sondern vor der Übergabe an die Druckmethode als Argument.

print(42 + 42)  => print(84)
print(type(list)) => print(<type 'type'>)
print(datetime.now()) => print(datetime.datetime(2019, 8, 15, 23, 9, 50, 619157))

Die interne Druckmethode konvertiert nur das angegebene Objekt in einen String, indem sie die __str __ () -Methode des übergebenen Objekts aufruft


f-strings unterstützen so etwas in Python 3.8 (derzeit in der Beta).

Aus den docs :

Eine f-Zeichenfolge wie f '{expr =}' erweitert den Text des Ausdrucks, ein Gleichheitszeichen und dann die Darstellung des ausgewerteten Ausdrucks. Zum Beispiel:

>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"

Die üblichen Formatangaben für F-Strings ermöglichen eine bessere Kontrolle darüber, wie das Ergebnis des Ausdrucks angezeigt wird:

>>> delta = date.today() - member_since
>>> f'{user=!s}  {delta.days=:,d}'
'user=eric_idle  delta.days=16,075'

Der = -Spezifizierer zeigt den gesamten Ausdruck an, damit Berechnungen angezeigt werden können:

>>> print(f'{theta=}  {cos(radians(theta))=:.3f}')
theta=30  cos(radians(theta))=0.866




logging