Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.python > #6257 > unrolled thread
| Started by | Christian Winther <cwsolani2020@nurfuerspam.de> |
|---|---|
| First post | 2025-03-19 19:45 +0100 |
| Last post | 2025-03-21 16:23 +0100 |
| Articles | 7 — 5 participants |
Back to article view | Back to de.comp.lang.python
[Python-de] Verstaendnis-Frage zu yield und Liste dahinter Christian Winther <cwsolani2020@nurfuerspam.de> - 2025-03-19 19:45 +0100
Re: [Python-de] Verstaendnis-Frage zu yield und Liste dahinter Tim Landscheidt <tim@tim-landscheidt.de> - 2025-03-19 20:51 +0000
Re: [Python-de] Verstaendnis-Frage zu yield und Liste dahinter Christian Winther <cwsolani2020@nurfuerspam.de> - 2025-03-20 18:33 +0100
Re: [Python-de] Verstaendnis-Frage zu yield und Liste dahinter "Peter J. Holzer" <hjp-usenet4@hjp.at> - 2025-03-20 19:15 +0100
Re: [Python-de] Verstaendnis-Frage zu yield und Liste dahinter Christian Winther <cwsolani2020@nurfuerspam.de> - 2025-03-20 19:34 +0100
Re: [Python-de] Verstaendnis-Frage zu yield und Liste dahinter Hermann Riemann <nospam.ng@hermann-riemann.de> - 2025-03-20 19:38 +0100
[Python-de] Re: Verstaendnis-Frage zu yield und Liste dahinter Hartmut Goebel <h.goebel@goebel-consult.de> - 2025-03-21 16:23 +0100
| From | Christian Winther <cwsolani2020@nurfuerspam.de> |
|---|---|
| Date | 2025-03-19 19:45 +0100 |
| Subject | [Python-de] Verstaendnis-Frage zu yield und Liste dahinter |
| Message-ID | <vrf3bc$4mvg$1@solani.org> |
Hallo Miteinander,
ich arbeite mich gerade ein bisschen in Python ein.
Ich habe hier Funktionen vorliegen ähnlich diesen hier:
def parse_was(info):
parsed = {}
info1, info2 = info
for idx, info1 in enumerate(info1):
name, status, cpu = info1
...
parsed[name] = {
"status": map.get(status, status_unknown).value,
"cpu_percent": float(cpu),
...
}
return parsed
def mach_was(parsed):
for name, value in parsed.items():
if value["cpu_percent"] is not None:
yield name, {}
----------------
Frage:
Was gibt
yield name, {}
zurück?
Speziell: Was macht/beinhaltet der Ausdruck: {}
MfG Christian
[toc] | [next] | [standalone]
| From | Tim Landscheidt <tim@tim-landscheidt.de> |
|---|---|
| Date | 2025-03-19 20:51 +0000 |
| Message-ID | <87v7s4eocl.fsf@vagabond.tim-landscheidt.de> |
| In reply to | #6257 |
Christian Winther <cwsolani2020@nurfuerspam.de> wrote:
> ich arbeite mich gerade ein bisschen in Python ein.
> Ich habe hier Funktionen vorliegen ähnlich diesen hier:
> def parse_was(info):
> parsed = {}
> info1, info2 = info
> for idx, info1 in enumerate(info1):
> name, status, cpu = info1
> ...
> parsed[name] = {
> "status": map.get(status, status_unknown).value,
> "cpu_percent": float(cpu),
> ...
> }
> return parsed
> def mach_was(parsed):
> for name, value in parsed.items():
> if value["cpu_percent"] is not None:
> yield name, {}
> ----------------
> Frage:
> Was gibt
> yield name, {}
> zurück?
> Speziell: Was macht/beinhaltet der Ausdruck: {}
„{}“ ist ein leeres „dictionary“
(https://docs.python.org/3/tutorial/datastructures.html#dictionaries).
Die yield-Anweisung gibt jeweils ein Tupel mit zwei Werten
zurück, von denen der erste der Wert von name ist und der
zweite ein leeres dictionary. Einfacheres Beispiel:
| >>> def test_yield():
| ... yield 'a', {}
| ... yield 'b', {}
| ... yield 'c', {}
| ...
| >>> for r in test_yield():
| ... print(repr(r))
| ...
| ('a', {})
| ('b', {})
| ('c', {})
| >>> for r1, r2 in test_yield():
| ... print(repr(r1), repr(r2))
| ...
| 'a' {}
| 'b' {}
| 'c' {}
| >>>
Tim
[toc] | [prev] | [next] | [standalone]
| From | Christian Winther <cwsolani2020@nurfuerspam.de> |
|---|---|
| Date | 2025-03-20 18:33 +0100 |
| Message-ID | <vrhjhs$5o94$1@solani.org> |
| In reply to | #6258 |
Am 19.03.2025 um 21:51 schrieb Tim Landscheidt:
[...]
>> Frage:
>
>> Was gibt
>> yield name, {}
>
>> zurück?
>
>> Speziell: Was macht/beinhaltet der Ausdruck: {}
>
> „{}“ ist ein leeres „dictionary“
> (https://docs.python.org/3/tutorial/datastructures.html#dictionaries).
> Die yield-Anweisung gibt jeweils ein Tupel mit zwei Werten
> zurück, von denen der erste der Wert von name ist und der
> zweite ein leeres dictionary. Einfacheres Beispiel:
[...]
Hallo Tim,
danke für Deine Erklärung.
So richtig bringt mich das auch nicht weiter.
Ich muss das wahrscheinlich testen.
Das Ganze stammt aus check_mk-Checks (für Huawei Access-Points), welche
ich für APs einer anderen Firma adaptieren will.
Wahrscheinlich ist da irgendwelche check_mk-Magic im Hintergrund, wo
eine derartige Ausgabe erwartet und weiterverarbeitet wird.
Ist im vorliegenden Code aber nicht zu sehen.
Test und Debug ist halt schwierig, weil man da eine passende Umgebung
braucht.
MfG Christian
[toc] | [prev] | [next] | [standalone]
| From | "Peter J. Holzer" <hjp-usenet4@hjp.at> |
|---|---|
| Date | 2025-03-20 19:15 +0100 |
| Message-ID | <slrnvtomq6.jo0i.hjp-usenet4@trintignant.hjp.at> |
| In reply to | #6259 |
On 2025-03-20 17:33, Christian Winther <cwsolani2020@nurfuerspam.de> wrote:
> Am 19.03.2025 um 21:51 schrieb Tim Landscheidt:
> [...]
>>> Frage:
>>
>>> Was gibt
>>> yield name, {}
>>
>>> zurück?
>>
>>> Speziell: Was macht/beinhaltet der Ausdruck: {}
>>
>> „{}“ ist ein leeres „dictionary“
>> (https://docs.python.org/3/tutorial/datastructures.html#dictionaries).
>> Die yield-Anweisung gibt jeweils ein Tupel mit zwei Werten
>> zurück, von denen der erste der Wert von name ist und der
>> zweite ein leeres dictionary. Einfacheres Beispiel:
>
> danke für Deine Erklärung.
>
> So richtig bringt mich das auch nicht weiter.
Bezieht sich Dein Verständnisproblem vielleicht eher darauf, was »yield«
macht? Das scheint mir jedenfalls konzeptionell schwieriger zu sein als
ein leeres Dictionary.
»yield« dient der Implementation von Generatoren bzw. Coroutinen. Es
unterbricht die Ausführung und liefert die Werte an den Aufrufer zurück,
aber im Gegensatz zu »return« ist die Funktion damit noch nicht beendet,
sondern setzt an der Stelle fort, wenn man den nächsten Wert anfprdert.
Hier ist z.B. ein (ziemlich sinnloses) Programm, an dem man das sieht:
#!/usr/bin/python3
def g():
print("g1")
yield 1
print("g2")
yield 2
print("g3")
yield 3
print("g4")
yield 4
for i in g():
print("<<")
print(i)
print(">>")
gg = g()
print("=1")
print(next(gg))
print("=2")
print(next(gg))
print("=3")
hjp
[toc] | [prev] | [next] | [standalone]
| From | Christian Winther <cwsolani2020@nurfuerspam.de> |
|---|---|
| Date | 2025-03-20 19:34 +0100 |
| Message-ID | <vrhn2s$5o93$1@solani.org> |
| In reply to | #6260 |
Am 20.03.2025 um 19:15 schrieb Peter J. Holzer:
[...]
> Bezieht sich Dein Verständnisproblem vielleicht eher darauf, was »yield«
> macht? Das scheint mir jedenfalls konzeptionell schwieriger zu sein als
> ein leeres Dictionary.
>
> »yield« dient der Implementation von Generatoren bzw. Coroutinen. Es
> unterbricht die Ausführung und liefert die Werte an den Aufrufer zurück,
> aber im Gegensatz zu »return« ist die Funktion damit noch nicht beendet,
> sondern setzt an der Stelle fort, wenn man den nächsten Wert anfprdert.
> [...]
Hallo Peter,
das yield-Konzept (Generator, der immer ein Element zurück liefert und
dann auf nächsten Aufruf wartet) habe ich schon verstanden.
Im konkreten Fall konnte in nur mit dem zusätzlichen leeren Dictionary
({}) im yield-Aufruf nichts anfangen.
Vermutlich erwartet aber die dahinter liegende "check_mk-Magic" da zwei
entsprechende Parameter. Ist aber aus dem vorliegenden Code nicht
ersichtlich, wie das weiter verwendet wird.
MfG Christian
[toc] | [prev] | [next] | [standalone]
| From | Hermann Riemann <nospam.ng@hermann-riemann.de> |
|---|---|
| Date | 2025-03-20 19:38 +0100 |
| Message-ID | <m435ksFsaqcU1@mid.individual.net> |
| In reply to | #6259 |
Am 20.03.25 um 18:33 schrieb Christian Winther:
> Test und Debug ist halt schwierig, weil man da eine passende Umgebung
> braucht.
Für kleinere Test verwende ich print(..)
Bei größeren Tests verwende ich in etwa folgendes:
te=open("/tmp/testausgabe.txt","w")
def wr_te(name,wert):
global te
fprint(f"{name}:{wert}\n")
Wobei name die Stellenmarkierung enthalten kann,
und wert oft ein f-string ist.
( Oder verwende entsprechend def wr_te(stelle,name,wert))
Eventuell kommt statt .txt .html in Frage,
insbesondere wenn es um Tabellen geht.
Eventuell ist global etwa use_te noch zweckmäßig
um Ausgaben in wr_te für Bedingungen Bereiche einzugrenzen.
Funktionen vom typ wr_te lassen sich einfach einfügen,
finden und löschen.
Und liefern mit hoher Wahrscheinlichkeit relevante Daten.
--
<http://www.hermann-riemann.de>
[toc] | [prev] | [next] | [standalone]
| From | Hartmut Goebel <h.goebel@goebel-consult.de> |
|---|---|
| Date | 2025-03-21 16:23 +0100 |
| Subject | [Python-de] Re: Verstaendnis-Frage zu yield und Liste dahinter |
| Message-ID | <0e3353e4-2c06-43f2-b13a-14d0a780c5f6@goebel-consult.de> |
| In reply to | #6262 |
Am 20.03.25 um 19:38 schrieb Hermann Riemann:
> fprint(f"{name}:{wert}\n")
Was ist dieses fprint? Das habe ich in Python noch nie gesehen und so
eine Funktion scheint mir unnötig wie ein Kropf. Dann das geht eleganter
und vermutlich effizienter mit print:
print(f"{name}:{wert)")
oder
print(name, wert, sep=":")
--
Schönen Gruß
Hartmut Goebel
Dipl.-Informatiker (univ), CISSP, CSSLP, ISO 27001 Lead Implementer
Information Security Management, Security Governance, Secure Software
Development
Goebel Consult, Landshut
http://www.goebel-consult.de
Blog:
https://www.goebel-consult.de/blog/2019/openstreetmaps-hat-google-maps-weit-ueberholt/
Kolumne:
https://www.goebel-consult.de/blog/cissp-gefluester/2011-11-in-troja-nichts-neues/
[toc] | [prev] | [standalone]
Back to top | Article view | de.comp.lang.python
csiph-web