Seite 1 von 1

Verstehe nicht den Fehler beim dict erstellen.

Verfasst: Sonntag 12. Mai 2013, 00:18
von MikeDee
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.

Re: Verstehe nicht den Fehler beim dict erstellen.

Verfasst: Sonntag 12. Mai 2013, 00:45
von cofi

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.

Re: Verstehe nicht den Fehler beim dict erstellen.

Verfasst: Sonntag 12. Mai 2013, 02:22
von Dami123

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

Re: Verstehe nicht den Fehler beim dict erstellen.

Verfasst: Sonntag 12. Mai 2013, 07:46
von Sirius3
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.

Re: Verstehe nicht den Fehler beim dict erstellen.

Verfasst: Sonntag 12. Mai 2013, 10:10
von MikeDee
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.

Re: Verstehe nicht den Fehler beim dict erstellen.

Verfasst: Sonntag 12. Mai 2013, 11:14
von cofi
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)`.