Seite 1 von 1

Namensraum der aufrufenden Funktion?

Verfasst: Montag 2. November 2009, 12:32
von Defnull
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'

Verfasst: Montag 2. November 2009, 12:49
von Defnull
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...

Verfasst: Montag 2. November 2009, 13:38
von ms4py
Und wenn du der Funktion den Namensraum einfach übergibst? (``locals()``)

Verfasst: Montag 2. November 2009, 13:43
von jbs

Code: Alles auswählen

import sys

def inner():
    print sys._getframe(1).f_locals

Verfasst: Montag 2. November 2009, 13:54
von Defnull
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.

Verfasst: Montag 2. November 2009, 14:51
von jbs
Aha, wusste ich nicht. :)