Verstehe nicht den Fehler beim dict erstellen.

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
Benutzeravatar
MikeDee
User
Beiträge: 31
Registriert: Samstag 5. November 2011, 12:41

Ich möchte ein Dictionary erstellen, mit Dateien als Schlüssel und den String "tagme" als Wert.

Was ich bisher gebastelt habe:

Code: Alles auswählen

dic = {}
for root, dirs, files in os.walk("C:/Dokumente und Einstellungen/Mike_Dee/Eigene Dateien/Eigene Bilder"):
    for extension in ["*.gif", "*.jpg"]:
        for filename in fnmatch.filter(files, extension):
            print(dic[filename] = "tagme")
und die simple kleine Fehlermeldung, die ich einfach nicht verstehe:

Code: Alles auswählen

SyntaxError: keyword can't be an expression
Ich weiß mein Fehler ist beim print(dic[filename] = "tagme"), ih weiß aber echt nicht mehr weiter wie es richtig sein müsste.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

In [2]: print(a = 42)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-364e6e46ec6b> in <module>()
----> 1 print(a = 42)

TypeError: 'a' is an invalid keyword argument for this function

In [3]: a = {}

In [4]: print(a[1] = 2)
  File "<ipython-input-4-1df2bcca826a>", line 1
SyntaxError: keyword can't be an expression
[4] ist dein Problem, [2] ein Beispiel, warum man das nicht zulassen sollte. Da es an verschiedenen Stellen (Compiler vs. Interpreter) auftritt, kommt man auch zu verschiedenen Fehlern.

Wie es richtig sein muesste, kommt darauf an, was du `print`en moechtest.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Code: Alles auswählen

print(dic[filename] = "tagme")
Du willst wahrscheinlich, dass "tagme" den filename String ausgibt beim Aufruf.
Das wäre dann:

Code: Alles auswählen

print(dic["tagme"] = filename)
Wenns nicht klappt, versuch "tagme" bereits vorher im {} zu erstellen. Oder filename erst zuweisen und dann printen.

http://www.tutorialspoint.com/python/py ... ionary.htm
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo MikeDee,
um nochmals die Fehlermeldung »SyntaxError: keyword can't be an expression« auseinander zu nehmen:
Es gibt einen »SyntaxError«, weil Du irgendein Konstrukt benutzt hast, das nicht in der Sprachdefinition erlaubt ist.
Ein »keyword« gibt es bei Funktionsaufrufen. Parameter können entweder durch ihre Position oder eben als Keyword übergeben werden. Zum Beispiel:

Code: Alles auswählen

>>> print(1,2,3, sep=', ')
1, 2, 3
>>>
Hier ist »sep« ein Keywordargument, und zwar eines, das »print« auch kennt.
»expression« ist nun alles was einen Wert hat oder haben kann, also »7« oder »a*6« oder »dic[filename]«, auf Deutsch „Ausdruck“.
Wenn Du das alles Zusammensetzt kommt heraus, dass die Fehlermeldung besagt, dass ein Ausdruck nicht als Schlüsselwort verwendet werden kann, sondern Keywords immer einfache Namen sein müssen.

Übrigens ist »dic[filename]="tagme"« kein Ausdruck, weil es auch keinen Wert hat, sondern eine Zuweisung. Es gibt Sprachen, da ist das anders (C, JavaScript, Perl, …), und man freut sich über solche schönen Meinungsverschiedenheiten zwischen dir und dem Compiler, was »if(a=5) …« bedeuten soll. 8)

Grüße
Sirius

PS: falls ich mal ein Pythonbuch schreiben werde, will ich gleich zu Anfang ein großes Kapitel zu Fehlermeldungen verstehen schreiben.
Benutzeravatar
MikeDee
User
Beiträge: 31
Registriert: Samstag 5. November 2011, 12:41

Ich möchte den Dict mit den filename:"tagme" paaren printen, um zu sehen ob alles richtig läuft. Und nein, es soll nicht anders herum sein, filename ist der Schlüssel.
Danke für die Erklärung der Fehlermeldung.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

MikeDee hat geschrieben:Ich möchte den Dict mit den filename:"tagme" paaren printen, um zu sehen ob alles richtig läuft.
Da das dict _alle_ bisherigen Paare enthaelt, willst du wohl eher `print(filename, "tagme")` ausfuehren ... oder gleich nur `print(filename)`.
Antworten