[EDIT 00]: Ich habe mehrmals den Beitrag und jetzt sogar den Titel bearbeitet, lesen Sie bitte weiter unten.Python String Interpolation Implementierung
ich gerade gelernt, über das Format String-Methode, und seine Verwendung mit Wörterbüchern, wie die mitgelieferten durch vars()
, locals()
und globals()
, Beispiel:
name = 'Ismael'
print 'My name is {name}.'.format(**vars())
Aber ich tun möchte:
name = 'Ismael'
print 'My name is {name}.' # Similar to ruby
So kam ich mit auf den Punkt:
def mprint(string='', dictionary=globals()):
print string.format(**dictionary)
Sie können hier mit dem Code interagieren: http://labs.codecademy.com/BA0B/3#:workspace
Schließlich, was ich liebe zu tun ist, um die Funktion in einer anderen Datei haben, my_print.py
benannt, so konnte ich tun:
from my_print import mprint
name= 'Ismael'
mprint('Hello! My name is {name}.')
Aber wie es Momentan gibt es ein Problem mit den Scopes. Wie kann ich den Namespace des Hauptmoduls als ein Wörterbuch aus der importierten mprint-Funktion erhalten? (nicht die von my_print.py
)
Ich hoffe, ich habe mich verstanden, wenn nicht, versuchen Sie, die Funktion von einem anderen Modul zu importieren. (Die Rückverfolgungs ist in der Verbindung)
Es ist die globals()
dict von my_print.py
Zugriff, aber natürlich der Variablenname wird nicht in diesem Bereich definiert, alle Ideen, wie dies zu erreichen?
Die Funktion funktioniert, wenn es im selben Modul definiert ist, aber beachten Sie, wie ich globals()
verwenden muss, denn wenn nicht, würde ich nur ein Wörterbuch mit den Werten innerhalb mprint()
Bereich bekommen.
Ich habe versucht, nichtlokale und Punktnotation zu verwenden, um auf die Hauptmodulvariablen zuzugreifen, aber ich kann es immer noch nicht herausfinden.
[EDIT 01]: Ich glaube, ich habe eine Lösung herausgefunden:
In my_print.py:
def mprint(string='',dictionary=None):
if dictionary is None:
import sys
caller = sys._getframe(1)
dictionary = caller.f_locals
print string.format(**dictionary)
In test.py:
from my_print import mprint
name = 'Ismael'
country = 'Mexico'
languages = ['English', 'Spanish']
mprint("Hello! My name is {name}, I'm from {country}\n"
"and I can speak {languages[1]} and {languages[0]}.")
Es druckt:
Hello! My name is Ismael, I'm from Mexico
and I can speak Spanish and English.
Was denkst du, Leute? Das war schwierig für mich!
Ich mag es, viel lesbarer für mich.
[EDIT 02]: Ich habe ein Modul mit einer interpolate
Funktion vorgenommen haben, eine Interpolate
Klasse und ein Versuch für eine interpolate
Klassenmethode analog der Funktion.
Es hat eine kleine Testsuite und seine dokumentiert!
Ich bin mit der Methodenimplementierung fest, ich verstehe es nicht.
Hier ist der Code: http://pastebin.com/N2WubRSB
Was denkt ihr?
[EDIT 03]: Ok Ich habe jetzt nur mit der interpolate()
Funktion angesiedelt.
In string_interpolation.py
:
import sys
def get_scope(scope):
scope = scope.lower()
caller = sys._getframe(2)
options = ['l', 'local', 'g', 'global']
if scope not in options[:2]:
if scope in options[2:]:
return caller.f_globals
else:
raise ValueError('invalid mode: {0}'.format(scope))
return caller.f_locals
def interpolate(format_string=str(),sequence=None,scope='local',returns=False):
if type(sequence) is str:
scope = sequence
sequence = get_scope(scope)
else:
if not sequence:
sequence = get_scope(scope)
format = 'format_string.format(**sequence)'
if returns is False:
print eval(format)
elif returns is True:
return eval(format)
Nochmals vielen Dank Jungs! Irgendwelche Meinungen?
[EDIT 04]:
Dies ist meine letzte Version, hat es ein Test, Docstrings und beschreibt einige Einschränkungen die ich gefunden habe: http://pastebin.com/ssqbbs57
Sie können schnell den Code testen hier : http://labs.codecademy.com/BBMF#:workspace
Und Klon grom git Repo hier: https://github.com/Ismael-VC/python_string_interpolation.git
bezogen werden: [? Ist ein String Formatierer, die Variablen von seinem Aufruf Umfang schlechte Praxis zieht] (http://stackoverflow.com/questions/13312240/is- a-string-formatter-that-zieht-variables-from-it-ruf-scope-bad-practice) – jfs
verwandt: [Druck Variablennamen und Inhalte als Debugging-Tool; Suche nach Emacs/Python-Verknüpfung] (http://stackoverflow.com/questions/2813227/printing-variable-names-and-contents-as-debugging-tool-looking-for-emacs-python) – jfs
Dies ist eine interessante Übung , aber ich warne vor dieser Art von implizitem Verhalten: Python rät davon ab ("Explizit ist besser als implizit" bedeutet hier, dass "mprint ('...', vars())' 'besser ist als 'mprint (' ... ')" zurück zum Aufrufer und seine lokalen Variablen erhalten), und ich denke, dass es aus guten Gründen tut (der explizite Code ist zweifellos einfacher zu lesen und beizubehalten). – EOL