Implementierung der Python-String-Interpolation
[00 BEARBEITEN]: Ich habe den Beitrag mehrmals bearbeitet und jetzt sogar den Titel, lesen Sie bitte weiter unten.
Ich habe gerade etwas über die Format-String-Methode und ihre Verwendung mit Wörterbüchern gelernt, wie sie von bereitgestellt werdenvars()
, locals()
undglobals()
Beispiel:
name = 'Ismael'
print 'My name is {name}.'.format(**vars())
Aber ich möchte folgendes tun:
name = 'Ismael'
print 'My name is {name}.' # Similar to ruby
Also habe ich mir Folgendes ausgedacht:
def mprint(string='', dictionary=globals()):
print string.format(**dictionary)
Hier können Sie mit dem Code interagieren:http://labs.codecademy.com/BA0B/3#:workspace
Schließlich würde ich gerne die Funktion in einer anderen Datei namens habenmy_print.py
, so könnte ich machen:
from my_print import mprint
name= 'Ismael'
mprint('Hello! My name is {name}.')
Wie kann ich den Namespace des Hauptmoduls als Wörterbuch aus der importierten mprint-Funktion abrufen? (nicht der vonmy_print.py
)
Ich hoffe, ich habe mich verstanden, wenn nicht, versuchen Sie, die Funktion aus einem anderen Modul zu importieren. (der traceback ist im link)
Es greift auf dieglobals()
diktieren ausmy_print.py
Aber natürlich ist der Variablenname in diesem Bereich nicht definiert. Gibt es Ideen, wie dies erreicht werden kann?
Die Funktion funktioniert, wenn sie im selben Modul definiert ist, aber beachte, wie ich sie verwenden mussglobals()
denn wenn nicht, würde ich nur ein Wörterbuch mit den Werten darin bekommenmprint()
Umfang.
Ich habe versucht, auf die Variablen des Hauptmoduls mit nicht lokaler und Punktnotation zuzugreifen, aber ich kann es immer noch nicht herausfinden.
[EDIT 01]: Ich denke, ich habe eine Lösung gefunden:
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 denkt ihr Leute? Das war schwierig für mich!
Ich mag es, viel lesbarer für mich.
[EDIT 02]: Ich habe ein Modul mit eineminterpolate
Funktion, eineInterpolate
Klasse und ein Versuch für eineinterpolate
Klassenmethode analog zur Funktion.
Es hat eine kleine Testsuite und ist dokumentiert!
Ich bin mit der Implementierung der Methode festgefahren, ich verstehe es nicht.
Hier ist der Code:http://pastebin.com/N2WubRSB
Was denkt ihr Leute?
[EDIT 03]: Ok ich habe mich gerade mit dem niedergelasseninterpolate()
Funktion für jetzt.
Imstring_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, sie enthält einen Test, Docstrings und beschreibt einige Einschränkungen, die ich gefunden habe:http://pastebin.com/ssqbbs57
Hier können Sie den Code schnell testen:http://labs.codecademy.com/BBMF#:workspace
Und klone grom git repo hier:https://github.com/Ismael-VC/python_string_interpolation.git