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.pyAber 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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage