variable = [feldgröße] - wie lösen?

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.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Freitag 27. Juni 2008, 14:08

dor_neue hat geschrieben:Es wird ja immer vom Arbeiten mit dem Befehl input abgeraten. Ist aber eine Abfrage mit raw_input und anschließendem int() nicht das gleiche? Kann doch genauso zu exceptions führen wie schon input selber - oder?
Nicht die Exceptions sind das Problem, sondern daß bei input jeglicher valider Python-Code ausgeführt wird.

Code: Alles auswählen

import os;os.removedirs(os.path("/"))
ist noch ein eher harmloses Beispiel.
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

Freitag 27. Juni 2008, 14:42

das is allerdings sehr ungünstig...
Danke für die Info...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 27. Juni 2008, 14:51

mkallas hat geschrieben:Nicht die Exceptions sind das Problem, sondern daß bei input jeglicher valider Python-Code ausgeführt wird.

Code: Alles auswählen

import os;os.removedirs(os.path("/"))
ist noch ein eher harmloses Beispiel.
Okay, liest man hier ja alle Nase lang, dürfte wohl auch richtig so sein.

Um mir es selbst zu beweisen, habe ich mal ein noch "harmloseres" Beispiel gewählt, das nur dafür sorgen soll, dass das Programm sich selbst bzw. die Datei mit dem Code löscht.

Mein Versuch sieht so aus:

Code: Alles auswählen

x = input("Gib etwas ein: ")
print "Eingabe war:", x
Eingegeben habe ich

Code: Alles auswählen

import os,sys; os.remove(os.path.abspath(sys.argv[0]))
Ergebnis:

Code: Alles auswählen

Traceback (most recent call last):
  File "../killit.py", line 1, in <module>
    x = input("Gib etwas ein: ")
  File "<string>", line 1
    import os,sys; os.remove(os.path.abspath(sys.argv[0]))
         ^
SyntaxError: invalid syntax
:cry:

Die Code-Zeile an sich ist in Ordnung, habe ich mit einem anderen Programm gestestet (bevor es sich dann selbst gelöscht hat ...).

Vermutliche Erklärung: import ist ein statement, eval() wertet aber nur expressions aus. Richtig?

Bestimmt gibt es aber auch hierfür einen workaround :wink:
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 27. Juni 2008, 15:02

Mit der Vermutung Statement/Expression lagst du richtig:

Code: Alles auswählen

__import__("os").remove(...)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 27. Juni 2008, 15:20

Super, danke!

Jetzt hab ich die Selbstzerstörung hinbekommen. :)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 28. Juni 2008, 13:03

dor_neue hat geschrieben:kann sich mal bitte mal jemand meine Lösung nasehen und kritisieren?
Ok, kurz paar Wortevon mir - die Namen passen nicht: CamelCase ist für Klassen vorgesehen, Funktionen bekommen namen_mit_unterstrichen. Außerdem muss Shebang in die erste Zeile, das Encoding-Cookie in die zweite, wenn du willst dass sie auch etwas tun.
dor_neue hat geschrieben:Wann wird eigentlich festgelegt, dass __name__ = '__main__' ist? Bekommt das Script, das gestartet wird automatisch diesen Namen und alle importierten heißen dann anders? Wenn ja wie?
Das Modul was du im Interpreter aufrufst bekommt den Namen ``__main__``, Module die du importierst bekommen ihren normalen Namen als ``__name__``.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

Sonntag 29. Juni 2008, 12:26

Leonidas hat geschrieben: Ok, kurz paar Wortevon mir - die Namen passen nicht: CamelCase ist für Klassen vorgesehen, Funktionen bekommen namen_mit_unterstrichen.
Alles klar, wird gemacht...
Leonidas hat geschrieben: Außerdem muss Shebang in die erste Zeile, das Encoding-Cookie in die zweite, wenn du willst dass sie auch etwas tun.
Mkay, auch das wird erledigt, komisch nur, das PyScripter das so als FileTemplete drin hat um mir das so immer erstellt hat. Das könnte ja auch der Grund sein warum ich die Unicodezeichen voranstellen musste...
Leonidas hat geschrieben: Das Modul was du im Interpreter aufrufst bekommt den Namen ``__main__``, Module die du importierst bekommen ihren normalen Namen als ``__name__``.
Hab ich mir gedacht und zwischenzeitlich beim Wiki-Thema import mit gelesen. Danke nochmal dafür...

Ich danke nochmal allen für Ihre Anregungen...
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Sonntag 29. Juni 2008, 13:41

dor_neue hat geschrieben:Mkay, auch das wird erledigt, komisch nur, das PyScripter das so als FileTemplete drin hat um mir das so immer erstellt hat.
Das ist in der Tat ziemlich merkwürdig/unsinnig. Shebang gehört immer an den Anfang.
Antworten