Variableninhalt 1:1 im Log wiedergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lord_icon
User
Beiträge: 8
Registriert: Mittwoch 8. März 2023, 17:54

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.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

`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.
lord_icon
User
Beiträge: 8
Registriert: Mittwoch 8. März 2023, 17:54

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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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
Benutzeravatar
grubenfox
User
Beiträge: 426
Registriert: Freitag 2. Dezember 2022, 15:49

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)),
            )
lord_icon
User
Beiträge: 8
Registriert: Mittwoch 8. März 2023, 17:54

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 ?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
grubenfox
User
Beiträge: 426
Registriert: Freitag 2. Dezember 2022, 15:49

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
Antworten