Wie ausprobieren, ob array existiert?

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
python48
User
Beiträge: 18
Registriert: Donnerstag 19. März 2015, 14:58

Hallo,

ich brauche einen check, um zu prüfen ob ein bestimmtes array Feld/Liste existiert.
Falls ja soll darauf zugegriffen werden, falls nicht, soll einfach eine Meldung geprinted werden,
damit kein error ausgegeben wird und meine scriptausführung nicht unterbrochen wird.
Wenn ich den unten geposteten code anwende, dann wird der folgende fehler asugegeben, falls
es das array nicht gibt, also in response[1] nichts reingeschrieben wurde.

Code: Alles auswählen

    if 1 < len(response):
TypeError: 'NoneType' object has no attribute '__getitem__'

Code: Alles auswählen

    if 1 < len(response):
        if response[1] != '101':
            print "ERROR"
        else:
            print "OK"
    else:
        pass
Würde mich sehr über Hilfe freuen, hab schon einiges ausprobiert, ohne erfolg.

Vielen Dank euch schon mal! :)

Beste Grüße, python48.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Prüfe *zuerst*, ob die Liste überhaupt mindestens zwei Einträge hat, und *danach* auf den Inhalt des Index. Schlägt die erste Prüfung fehl, so wird die zweite, die dann eigentlich zu einem ``IndexError`` führen würde, nicht mehr ausgeführt:

Code: Alles auswählen

if len(response) > 1 and response[1] == "101":
    print("OK")
else:
    print("ERROR")
Edit: Ach... dank DasIch habe ich jetzt erst gesehen, dass ``response`` auch ``None`` sein kann. Dann müsste man den Test entsprechend *ganz nach vorne* stellen!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

response ist, wie die Exception schon sagt, None und kein Array. Arrays verwendet man übrigens nur sehr selten, üblicherweise verwendet man Listen, die du wahrscheinlich auch meinst.

Speziell auf None kann man mit ``obj is None`` testen.
python48
User
Beiträge: 18
Registriert: Donnerstag 19. März 2015, 14:58

Wie kann ich mir die obj is NONE abfrage vorstellen?

Code: Alles auswählen

    if response == `obj is None`:
        print("ERROR")
    else:
        print("OK")

Vielen Dank euch schon mal :)

EDIT: Sorry, ja ich meine listen und nicht arrays :)
BlackJack

@python48: ``is`` ist ein binärer Operator wie ``==``. Genau so benutzt man den auch.
python48
User
Beiträge: 18
Registriert: Donnerstag 19. März 2015, 14:58

danke.

Bei

Code: Alles auswählen

if response != 'None':
gibts den fehler:

Code: Alles auswählen

    if response[1] != '101':
TypeError: 'NoneType' object has no attribute '__getitem__'
Auch Fehler bei

Code: Alles auswählen

if response[1] != 'None':
Bei nur

Code: Alles auswählen

if response != None:
sagt er mir, dass auf None nicht mit equality operators geprüft wird.

Was mache ich hier falsch? :/
BlackJack

@python48: Wer sagt das? Doch wahrscheinlich Deine IDE und nicht Python und das ist eine Warnung und kein Fehler. Allerdings ist die Warnung ja richtig denn wir hatten ja gerade den Operator den man benutzt geklärt, warum schreibst Du dann wieder ``!=``?
python48
User
Beiträge: 18
Registriert: Donnerstag 19. März 2015, 14:58

Es funzt, ich ignorier mal die anmerkung meiner IDE.

Ich benutze '!=' weil es für mein programm gerade vorteilhafter ist.
Außerdem wird bei '==' die gleiche warnung ausgesprochen.

Vielen Dank für die schnelle hilfe! :)


Beste Grüße, python48.
BlackJack

@python48: Natürlich wird bei ``==`` die gleiche Warnung angezeigt, ist ja auch ein Test auf Wertegleichheit. ”Vorteilhafter” ist das nur weil Du offenbar nicht weisst wie grundlegende Ausdrücke in Python funktionieren und was ein binärer Operator ist. Da kann man sich natürlich drauf ausruhen, muss man aber nicht.
python48
User
Beiträge: 18
Registriert: Donnerstag 19. März 2015, 14:58

Womöglich hast du recht, das wusste ich wirklich nicht.
Habe angenommen, dass '!=' einfach das invertierte von '==' ist.

Ein kuzes Stichwort oder Hinweis mehr hätte jetzt an dieser Stelle auch nicht geschadet,
trozdem vielen dank ;)
DaftWullie
User
Beiträge: 37
Registriert: Donnerstag 17. Mai 2012, 21:28

@python48
eine kurze Google-Suche hätte auch nicht geschadet. in PEP8 steht auch etwas dazu...
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@python48: es geht hier nicht um == oder !=, das ist tatsächlich im Normalfall das Gegenteil vom anderen. Es geht darum, dass man auf None per "is" oder "is not" prüft. Alternativ kann man auch einfach versuchen auf response[1] zuzugreifen und die anderen Fälle per Exception abfangen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und noch viel wichtiger: Nutze eine Python-Shell zum Experimentieren bei solchen Fragen! Das kann man darin alles viel schneller ermitteln und nachhaltiger mental verarbeiten, als durch mühsames, iteratives Umschreiben und Starten eines Programms.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten