2015-11-01 14 views
8

ich eine andere Funktion len in __init__.py Datei meines Pakets die folgende Art und Weise zuweisen mag:überwiegende in __init__.py len - Python

llen = len 
len = lambda x: llen(x) - 1 

Es funktioniert gut, aber nur in der __init__.py Datei. Wie kann ich andere Module in meinem Paket beeinflussen?

Antwort

2

Wenn Sie versuchen, einen Namen zu laden, der nicht als globale Modulebene oder lokale Funktion definiert ist, sucht Python im Modul __builtin__ (builtins in Python 3) nach. In beiden Versionen von Python ist dieses Modul im globalen Gültigkeitsbereich auch als __builtins__ verfügbar. Sie können dieses Modul ändern und das wird nicht nur Ihren Code beeinflussen, sondern jeder Python-Code irgendwo, der nach der Ausführung Ihres Codes ausgeführt wird !!

import __builtin__ as builtins # import builtins in python 3 
llen = len 
builtins.len = lambda a:llen(a) - 1 
+0

Danke! Arbeitete gut für mich :) – DorianOlympia

+1

** '__builtins__' ist ein privates Implementierungsdetail in CPython. ** Sie sollten stattdessen explizit das' builtins' Modul (oder '__builtin__' in Python 2) importieren. – ppperry

4

Dies ist vielleicht nicht die Antwort, die Sie suchen, aber ich würde dies nicht tun, wenn ich Sie wäre (und ich bin mir ziemlich sicher, dass Sie nicht leicht, sowieso).

Der Grund, warum Sie nicht sollten, ist, dass Python intern len auf seine Objekte verwendet, um bestimmte Operationen durchzuführen. Ein anderer Grund ist reine gebrochene Logik. Ihre oben definierte len Funktion würde eine negative Länge für leere Listen oder leere Dinge zurückgeben. Das scheint mir ziemlich kaputt zu sein.

Was Sie können tun, ist die Längenmethode nur auf bestimmte Klassen überschreiben (das könnte eine Menge Sinn für Sie). Dazu Sie Betreiber Überlastung verwenden können, außer Kraft setzen nur die Methode __len__ in Ihrer Klasse:

class MyList(object): 
    def __len__(self,): 
     # Do your thing 

Sie auch in Meta-Klassen suchen möchten, gibt es eine sehr gute stack overflow Frage zu diesem Thema ist.

+0

Ich stimme Ihnen zu! Ich weiß, dass ein solches Verhalten nicht wirklich angemessen ist. Aber dieser Code ist Teil meiner Hausaufgaben. Ich muss ein Programm mit wirklich nervigem und schwer zu findendem Programm erstellen. Ich dachte, etwas anderes zu einer einfachen und oft benutzten Funktion (wie zum Beispiel len) zuzuordnen, ist eine nette Idee! :) – DorianOlympia