Python-Äquivalent von PHP's compact () und extract ()

7

kompakt () und extrahieren () sind Funktionen in PHP finde ich enorm praktisch. compact () nimmt eine Liste von Namen in der Symboltabelle und erstellt eine Hashtabelle nur mit ihren Werten. Auszug macht das Gegenteil. z.B.,

%Vor%

Gibt es eine Möglichkeit, dasselbe in Python zu machen? Ich habe mich rundherum umgeschaut, und der nächste, dem ich gekommen bin, ist dieser Thread , der die Stirn zu runzeln scheint.

Ich weiß über local (), globals () und vars (), aber wie kann ich nur eine Teilmenge ihrer Werte auswählen?

Hat Python etwas noch besser, das die Notwendigkeit dafür beseitigt?

    
Turadg 23.04.2009, 22:21
quelle

6 Antworten

10

Es ist nicht sehr Pythonic, aber wenn Sie wirklich müssen:

%Vor%

Ich habe diese Implementierungen ziemlich oft verwendet, und sie funktionieren, aber die technische Änderung von f_locals wird nicht unterstützt.

Aber im Ernst, wenn Sie wirklich das Gefühl haben, dass Sie diese Funktionen brauchen, tun Sie wahrscheinlich etwas falsch. Es scheint gegen Pythons Philosophie zu mindestens drei Punkten zu laufen: "Explizit ist besser als implizit", "Einfach ist besser als komplex", "Wenn die Implementierung schwer zu erklären ist, ist es eine schlechte Idee", vielleicht sogar mehr (und wirklich, wenn Sie genug Erfahrung in Python haben, wissen Sie, dass solche Sachen einfach nicht gemacht werden). Ich könnte sehen, dass es für eine Debugger- oder Post-Mortem-Analyse nützlich ist, oder vielleicht für eine Art sehr allgemeines Framework, das häufig Variablen mit dynamisch gewählten Namen und Werten erstellen muss, aber es ist eine Strecke.

Wenn Sie diese Funktionen verwenden möchten, sollten Sie zumindest die extract ed-Variablen in kleinen Bereichen enthalten. Wickeln Sie sie in Funktionen ein, die Sie dann als "Black Boxes" betrachten können. Der Hauptgrund, dass extract schlecht ist, besteht darin, dass Variablen in Ihre Symboltabelle in einer Weise eingefügt werden, die aus der Überprüfung des Codes nicht ersichtlich ist. Wenn Sie die Auswirkungen dieser Variablen auf eine sehr kleine Funktion beschränken und erklären, was Sie mit klarem Code und Kommentaren machen, ist das kein großes Problem.

    
David Z 23.04.2009, 22:47
quelle
9

Ich fürchte, es gibt keine Entsprechungen in Python. Bis zu einem gewissen Grad können Sie ihren Effekt simulieren, indem Sie locals :

verwenden (und übergeben) %Vor%

Trotzdem finde ich diese Funktionen nicht "sehr praktisch". Dynamische globale / lokale Variablen sind böse und fehleranfällig - PHP-Leute haben das gelernt, als sie register_globals entmutigten. Aus meiner Erfahrung verwenden nur wenige erfahrene PHP-Programmierer oder große Frameworks compact() oder extract() .

In Python ist explizit besser als implizit :

%Vor%     
Ferdinand Beyer 23.04.2009 22:40
quelle
6

Es lohnt sich, darauf hinzuweisen, dass extract() (und in geringerem Maße compact() ) eine der "bösartigsten" Funktionen von PHP ist (zusammen mit register_globals und eval ) und vermieden werden sollte ?

extract macht es viel schwieriger zu bestimmen, wo eine Variable definiert wurde. Wenn es schwieriger ist, eine Variable zurück zu dem Ort zu bringen, an dem sie definiert wurde, ist es schwieriger, nach allgemeinen Sicherheitsproblemen wie der Verwendung nicht initialisierter Variablen oder ungefilterter Variablen zu suchen, die von Benutzereingaben stammen.

compact ist nicht so schlimm, aber wenn es schlecht verwendet wird, kann es immer noch schwieriger als Es wäre sonst zu sehen, wo ein Array-Mitglied aus einer Variablen gesetzt wird.

Das Äquivalent von extract() in vielen anderen Sprachen ist das Schlüsselwort with . Python hat jetzt ein with Schlüsselwort, obwohl es ein bisschen anders funktioniert, was es nicht ganz wie extract() macht. In anderen Sprachen, wie z. B. Javascript, hat das with -Schlüsselwort ebenfalls einen schlechten Ruf .

Ich denke, der beste Rat wäre, anders zu denken - anstatt zu versuchen, ein schlechtes Feature von PHP zu emulieren, denke über andere Möglichkeiten nach, was du mit klarem und lesbarem Code machen willst.

    
thomasrutter 24.04.2009 05:57
quelle
3

PHPs kompakte Funktion in Python (funktioniert mit 2.6; funktioniert nicht mit früheren Versionen von Python):

%Vor%

Ich habe ausführlich darüber geschrieben: Python kann genauso hässlich sein wie PHP .

    
Elf Sternberg 14.05.2009 18:13
quelle
2

Ich denke, das Äquivalent von extract($x) ist globals().update(x) , wie für compact() ist es eine Untermenge von vars()

%Vor%     
Adam 23.04.2009 22:32
quelle
1

Sie können das tun (obwohl ich nur sparsam vorschlage ...) mit der Funktion locals() , die eine aktualisierbare dict zurückgibt. Beispiel:

%Vor%

So wäre locals() "compact all" und locals().update() wäre extract .

Viel Glück!

    
keredson 23.09.2016 20:54
quelle

Tags und Links