Die Liste der Funktionen in einer Funktion in Python dynamisch durchlaufen

7

Ich würde gerne sehen, ob es möglich ist, eine Liste von Funktionen in einer Funktion zu durchlaufen. Das nächste, was ich finden könnte, ist das Durchlaufen eines ganzen Moduls. Ich möchte nur eine vorgewählte Liste von Funktionen verwenden.

Hier ist mein ursprüngliches Problem:

  1. Wenn Sie einen String angeben, prüfen Sie jeden Buchstaben, um festzustellen, ob einer der 5 Tests erfüllt ist.
  2. Wenn ein Minimum von 1 Buchstaben eine Prüfung besteht, geben Sie True zurück.
  3. Wenn alle Buchstaben in der Zeichenfolge die Prüfung nicht bestanden haben, geben Sie False zurück.
  4. Für jeden Buchstaben in der Zeichenfolge überprüfen wir diese Funktionen: isalnum (), isalpha (), isdigit (), islower (), isupper ()
  5. Das Ergebnis jedes Tests sollte auf verschiedene Zeilen gedruckt werden.

Beispieleingabe

%Vor%

Beispielausgabe (muss in separate Zeilen gedruckt werden, True, wenn mindestens ein Buchstabe übergeben wird, oder false, wenn alle Buchstaben bei jedem Test fehlschlagen):

%Vor%

Ich habe dies für einen Test geschrieben. Natürlich könnte ich nur 5 verschiedene Code-Sätze schreiben, aber das scheint hässlich. Dann begann ich mich zu fragen, ob ich einfach alle Tests durchlaufen konnte, nach denen sie verlangten.

Code für nur einen Test:

%Vor%

Mein fehlgeschlagener Versuch, eine Schleife mit allen Tests auszuführen:

%Vor%

Wie repariere ich diesen Code, um alle Regeln dort zu erfüllen?

Verwendung von Informationen aus allen Kommentaren - dieser Code erfüllt die oben genannten Regeln und durchläuft jede Methode dynamisch.

%Vor%

getattr-Ansatz (ich glaube, das nennt man Introspektions-Methode?)

%Vor%

Listenverständnisansatz:

%Vor%     
jhub1 10.09.2016, 04:42
quelle

7 Antworten

7

Die Art und Weise, wie Sie eine Liste von Funktionen durchlaufen, ist etwas aus. Dies wäre ein guter Weg, dies zu tun. Die Funktionen, die Sie in der Liste speichern müssen, sind die generischen Zeichenfolgenfunktionen, die von str.funcname angegeben werden. Sobald Sie diese Liste von Funktionen haben, können Sie sie mit einer for-Schleife durchlaufen und behandeln Sie sie wie eine normale Funktion!

%Vor%

Beispielausgaben:

%Vor%

Ich merke auch, dass Sie die Indexierung für die Iteration verwenden, was mir das Gefühl gibt, dass Sie aus einer Sprache wie C / C ++ kommen könnten. Das For-In-Loop-Konstrukt ist in Python wirklich mächtig, also würde ich es (y) nachlesen.

Oben ist eine mehr pythische Art, dies zu tun, aber nur als ein Lernwerkzeug, schrieb ich eine Arbeitsversion, die so gut wie möglich zusammenpasst, um Ihnen zu zeigen, wo Sie speziell schief gelaufen sind. Hier ist es mit Kommentaren:

%Vor%     
gowrath 10.09.2016, 05:01
quelle
3

Okay, also ist die erste Frage einfach genug. Der einfache Weg ist einfach

%Vor%

Vernachlässige nie die einfachste Sache, die funktionieren könnte.

Wenn Sie es jetzt dynamisch tun möchten - was das magische Schlüsselwort ist, das Sie wahrscheinlich gebraucht haben, möchten Sie so etwas anwenden (aus eine andere Frage ):

%Vor%

Achtung, dies ist ein nicht getesteter Code, der Ihnen die Idee geben soll. Der Schlüsselgedanke hierbei ist, dass die Methoden eines Objekts genau wie alles andere Attribute sind, also zum Beispiel getattr("a", "isalpha")() Folgendes tut:

  • Verwendet getattr , um das Attributverzeichnis von "a" für eine Methode mit dem Namen isalpha zu durchsuchen.
  • Gibt diese Methode selbst zurück - <function isalpha>
  • ruft dann diese Methode mit dem () auf, das der Funktionsoperator in Python ist.

Siehe dieses Beispiel:

%Vor%     
Charlie Martin 10.09.2016 05:09
quelle
2

Ich werde raten, dass Sie die Passwortkomplexität validieren, und ich werde auch sagen, dass Software, die eine Eingabe nimmt und "Falsch" sagt, und es keinen Hinweis darauf gibt, warum Benutzer ist -hostile, also ist das Wichtigste nicht, "wie man über verschachtelten Zeichen Funktionscode-Zauberei (*)", sondern "gibt gutes Feedback" und schlägt etwas mehr wie:

vor %Vor%

Versuchen Sie online unter repl.it

Und die Regex-Suche prüft Bereiche von Zeichen und Ziffern in einem Anruf, was besser ist als eine Schleife über Zeichen.

(PS. Ihre Funktionen überschneiden sich; eine Zeichenkette mit Zeichen, die 'isupper', 'islower' und 'isnumeric' entsprechen, hat bereits 'isadigit' und 'isalnum' abgedeckt. Interessanter wäre die Behandlung von Zeichen wie ! which sind nicht obere, untere, Ziffern oder alnum).

(*) Funktionswizardie wie die anderen Antworten ist normalerweise genau das, was ich antworten würde, aber es gibt so viel davon bereits beantwortet, dass ich genauso gut den anderen Weg stattdessen antworten kann: P

    
TessellatingHeckler 10.09.2016 05:17
quelle
2

Alle anderen Antworten sind korrekt, aber da Sie ein Anfänger sind, möchte ich auf das Problem in Ihrem Code hinweisen:

%Vor%

Erstens: Ich bin mir nicht sicher, welchen Wert ich gerade in Ihrem Code hat, aber er scheint irgendwo in den String zu zeigen - was dazu führt, dass einzelne Zeichen ausgewertet werden, nicht die ganze Zeichenfolge roh .

Zweitens: Wenn Sie Ihre Liste erstellen, rufen Sie bereits die Methoden auf, die Sie einfügen möchten, was dazu führt, dass nicht die Funktionen selbst eingefügt werden, sondern ihre Rückgabewerte (deshalb sehen Sie all diese True -Werte in Ihrer print-Anweisung).

Versuchen Sie, Ihren Code wie folgt zu ändern:

%Vor%     
andreas-hofmann 10.09.2016 05:16
quelle
2

Um die ursprüngliche Frage zu beantworten:

%Vor%     
J Earls 10.09.2016 05:01
quelle
1

Da Sie eine Liste von einfachen Elementen durchlaufen und versuchen herauszufinden, ob all der Funktionen hat any gültige Ergebnisse, Sie können einfach die Liste der Funktionen definieren möchte die Eingabe aufrufen und diese zurückgeben. Hier ist ein ziemlich pythisches Beispiel für das, was Sie erreichen möchten:

%Vor%

Testen Sie es:

%Vor%     
metatoaster 10.09.2016 04:59
quelle
1

Sie können Introspektion , um alle Attribute eines Objekts zu durchlaufen, egal ob es sich um Funktionen oder um einen anderen Typ handelt.

Allerdings möchten Sie das wahrscheinlich nicht, weil str viele Funktionsattribute hat und Sie nur an fünf interessiert sind. Es ist wahrscheinlich besser, das zu tun, was Sie getan haben, und einfach eine Liste der fünf gewünschten zu erstellen.

Außerdem müssen Sie nicht jedes Zeichen der Zeichenfolge durchlaufen, wenn Sie nicht möchten; Diese Funktionen betrachten bereits die ganze Zeichenfolge.

    
John Gordon 10.09.2016 04:59
quelle

Tags und Links