Namensraum der aufrufenden Funktion?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Gibt es eine Möglichkeit, zur Not auch eine etwas dreckige, um in einer Funktion an den Namensraum der aufrufenden Funktion zu kommen? Folgendes Code-Beispiel:

Code: Alles auswählen

def outer():
  a = 'a'
  return inner()

def inner():
  ...
  return a

print outer() --> 'a'
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Habe es selbst raus gefunden

Code: Alles auswählen

>>> import inspect
>>> 
>>> def outer():
...   a = 'a'
...   return inner()
... 
>>> def inner():
...   return inspect.stack()[1][0].f_locals.get('a')
... 
>>> outer()
'a'
Die Idee war, den template() Aufruf bei Bottle etwas netter zu gestalten, indem das Template einfach im selben Namensraum aufgerufen wird wie die Handler-Funktion. Aber das ist glaub ich etwas zu hacky...
Bottle: Micro Web Framework + Development Blog
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Und wenn du der Funktion den Namensraum einfach übergibst? (``locals()``)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

import sys

def inner():
    print sys._getframe(1).f_locals
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

ice2k3: Genau das will ich ja vermieden. Aber ich gehe jetzt wohl eher den Weg mit dem Threading.local objekt im Bottle-Modul-Namensraum, das bei jedem Request geleert wird. Das wäre auch konsistent zu bottle.request und bottle.response und ist nicht ganz so 'magisch' wie die Stack-Geschichte.

Code: Alles auswählen

from bottle import route, tpl

@route('/')
@view('template_name')
def index():
    tpl.title = 'abc'
    tpl.header = 'Abc'
    return
@jbs: Die Funktion ist implementierungsabhängig und sollte nicht verwendet werden.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Aha, wusste ich nicht. :)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Antworten