Seite 1 von 1

Variableninhalt 1:1 im Log wiedergeben

Verfasst: Sonntag 26. März 2023, 12:26
von lord_icon
Hi,

wenn ich folgenden Befehl absetze:
file_logger.info(f"{fileoutput}")
bekomme ich folgendes:

Code: Alles auswählen

2023-03-26 14:07:49,698 | [file(filename='/mnt/hgfs/save.log', file_size=108, time=1675872791), file(filename='/mnt/hgfs/output.log',
Ich habs mal in Lesbarer Form gebracht:

Code: Alles auswählen

2023-03-26 14:07:49,698 | [file(filename='/mnt/hgfs/save.log', 
                                                        file_size=108, 
                                                        time=1675872791), 

                                                        file(filename='/mnt/hgfs/output.log',
                                                        etc...
Es wird der Inhalt eines Verzeichnises eingelesen. Alle Datein werden dann hintereinander ausgegeben.

"fileoutput" liegt aber sicherlich nicht in der Form vor wie es im Log ankommt.

Nun bin ich leider nur Profi in PHP.
Da stehen mir var_dump und print_r zur Verfügung. Da kommt dann sowas ähnliches raus

Code: Alles auswählen

stdClass Object ( 
 [0] => qualitypoint
 [1] => technologies
 [2] => India
)
In Python will mir das aber nicht gelingen.

Code: Alles auswählen

file_logger.info(json.dumps(fileoutput))
file_logger.info(json.dumps(f"{fileoutput}"))
file_logger.info(str(fileoutput))
file_logger.info(print(fileoutput))
ergeben alles Fehler.

Habt Ihr Ideen wie es umsetzen könnte ?


Nachtrag: definiert wird es am Script-Anfang:

Code: Alles auswählen

def _convert_file_info_list(file_infos: List[FileInfo]) -> List[File]:
    fileoutput: List[File] = []
    for file_info in file_infos:
        fileoutput.append(
            File(
                filename=file_info.prover.get_filename(),
                size=file_info.prover.get_size(),
                time_modified=uint64(int(file_info.time)),
            )
        )
    return fileoutput
Aufgerufen wird es mittels
fileoutput = _convert_file_info_list(loaded)


Ich hoffe, das bringt euch näher... ich weiß noch nicht mal ob das dann ein Objekt,Variable,Text-String oder ähnliches am Ende rauskommt.
Ich sehe da noch ganz am Anfang.

Re: Variableninhalt 1:1 im Log wiedergeben

Verfasst: Sonntag 26. März 2023, 12:47
von __deets__
Ich verstehe die Frage nicht. Im log sind doch alle Informationen, die in der Funktion erzeugt werden, gut lesbar. Was soll denn da anders werden?

Re: Variableninhalt 1:1 im Log wiedergeben

Verfasst: Sonntag 26. März 2023, 12:48
von Sirius3
`fileoutput` ist eine Liste von File-Objekten, die ja auch exakt so im Log ausgegeben werden.
Daher verstehe ich nicht, was Du eigentlich erwartest.
Programmcode zu raten ist selten erfolgsversprechend.

Re: Variableninhalt 1:1 im Log wiedergeben

Verfasst: Sonntag 26. März 2023, 12:53
von lord_icon
najaa...
fileoutput: List[File] = []

Hier wird ja "fileoutput" erstmal leer erzeugt. Wenn ich es richtig verstanden habe, dann als Objekt.

In PHP sieht ein Objekt aber so aus:

Code: Alles auswählen

stdClass Object ( 
 [0] => qualitypoint
 [1] => technologies
 [2] => India
)
In Python verstehe ich aber nicht, wie dessen Aufbau aussehen soll/muß.
Bzw. Wir drehen es einfach mal um:

Ich möchte in dieses Objekt reinschreiben und erweitern. Dazu müsste ich erstmal das Objekt selbst verstehen.
Und daran hapert es aktuell

Re: Variableninhalt 1:1 im Log wiedergeben

Verfasst: Sonntag 26. März 2023, 13:13
von Sirius3
In Python ist alles ein Objekt. In PHP ist das, was sich dort Object nennt, etwas sehr seltsames.
`fileoutput` ist eine Liste, und wie jedes Object, hat eine Liste verschiedene Methoden, um mit der Liste zu arbeiten. Dafür gibt es die Dokumentation: https://docs.python.org/3/tutorial/data ... e-on-lists

Re: Variableninhalt 1:1 im Log wiedergeben

Verfasst: Sonntag 26. März 2023, 13:19
von grubenfox
und die Liste enthält offenbar Objekkte vom Typ "File" (werden per "append" an die Liste angehängt):
lord_icon hat geschrieben: Sonntag 26. März 2023, 12:26 Nachtrag: definiert wird es am Script-Anfang:

Code: Alles auswählen

def _convert_file_info_list(file_infos: List[FileInfo]) -> List[File]:
    fileoutput: List[File] = []
    for file_info in file_infos:
        fileoutput.append(
            File(
                filename=file_info.prover.get_filename(),
                size=file_info.prover.get_size(),
                time_modified=uint64(int(file_info.time)),
            )
        )
    return fileoutput
Keine Ahnung wie File nun genau und komplett aufgebaut ist, aber mindestens die Attribute "filename", "size" und "time_modified" sind offenbar hier interessant:

Code: Alles auswählen

            File(
                filename=file_info.prover.get_filename(),
                size=file_info.prover.get_size(),
                time_modified=uint64(int(file_info.time)),
            )

Re: Variableninhalt 1:1 im Log wiedergeben

Verfasst: Sonntag 26. März 2023, 14:25
von lord_icon

Code: Alles auswählen

            file_info_to_edit = loaded[0]  # wähle das erste Objekt aus der Liste aus

            new_file_info = FileInfo(  # erzeuge ein neues Objekt
                prover=new_prover,
                filename='test.log'
                file_size=123456789,
                time_modified=1675872791
            )
            loaded.append(new_file_info)  # füge das neue Objekt zur Liste hinzu
Soweit hätte ich es nun gedacht + bzw. so wie ich es lt. Doku verstanden habe.

Mein unverständnis fängt aber schon in der ersten Zeile an mit: loaded[0]

Ich würde ja gern was an das Ende ranstellen wollen. Ich kenne ja nicht die Länge des Objektes.
Aber selbst wenn ich mal darüber hinaussehe = es klappt nicht. Der Eintrag wird nicht gebildet.
Ist doch nochwas falsch ?

Re: Variableninhalt 1:1 im Log wiedergeben

Verfasst: Sonntag 26. März 2023, 14:34
von __deets__
Wozu soll denn dieser Zugriff auf loaded[0] gut sein? Du erzeugst doch einfach nur ein neues FileInfo Objekt, und das soll angehangen werden. Was also soll dieses file_info_to_edit?

Re: Variableninhalt 1:1 im Log wiedergeben

Verfasst: Sonntag 26. März 2023, 15:10
von __blackjack__
@lord_icon: Neben der Sinnfrage dieses Zugriffs, ist das ja zusätzlich auch eine mögliche Fehlerquelle, weil das zu einem `IndexError` führt, falls die Liste leer ist.

Die ursprüngliche Konvertierungsfunktion bietet sich übrigens *sehr* dafür an mit einer „list comprehension“ formuliert zu werden:

Code: Alles auswählen

def _convert_file_infos(file_infos):
    return [
        File(
            filename=file_info.prover.get_filename(),
            size=file_info.prover.get_size(),
            time_modified=uint64(int(file_info.time)),
        )
        for file_info in file_infos
    ]
Mal davon abgesehen, dass die `repr`-Darstellung von `File`-Objekten doch ziemlich ausführlich ist, ausführlicher als die Standard-`__repr__()`-Methode die man sonst so von `object` erbt, muss man halt in die Dokumentation und/oder den Quelltext schauen, wenn man etwas über Datenytpen erfahren möchte.

Interaktive Python-Shells wie IPython können hilfreich sein sich Objekte und Datentypen “live“ anzuschauen.

Re: Variableninhalt 1:1 im Log wiedergeben

Verfasst: Sonntag 26. März 2023, 16:17
von grubenfox
und wo kommt das komische

Code: Alles auswählen

new_file_info = FileInfo( 
                prover=new_prover,
"FileInfo" und "prover" her?

zum ursprünglichen
lord_icon hat geschrieben: Sonntag 26. März 2023, 12:26 Nachtrag: definiert wird es am Script-Anfang:

Code: Alles auswählen

def _convert_file_info_list(file_infos: List[FileInfo]) -> List[File]:
    fileoutput: List[File] = []
    for file_info in file_infos:
        fileoutput.append(
            File(
                filename=file_info.prover.get_filename(),
                size=file_info.prover.get_size(),
                time_modified=uint64(int(file_info.time)),
            )
        )
    return fileoutput
passt das ja nun gar nicht