Найти - Пользователи
Полная версия: Посмотреть простанство имён вызывающего контекста
Начало » Python для экспертов » Посмотреть простанство имён вызывающего контекста
1 2
alien308
Необходимо внутри функции определить есть ли данная переменная в пространстве имён вызывающего контекста. dir() без аргументов возвращает только локальное пространство имён.
Что то такое:
 def f():
    if not (dx in внешние_переменные):
        dx = 0.01
    . . . 
dx = 0.1
res = f()

Python 2.7
Rodegast
 "dx" in f.__globals__
alien308
Не совсем то. Возвращается не пространство имён вызывающего контекста, а глобальное пространство имён.

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
def f():
    print f.__globals__['dx']
dx = 0.1    
print "Вызов из глобальной области: ", 
f()
def ff():
    dx = 1.0
    f()
print "Вызов из функции: ",
ff()

Вывод:
 Вызов из глобальной области:  0.1
Вызов из функции:  0.1
Rodegast
 locals()
alien308
Нету его там, только локальные переменные.
 #!/usr/bin/env python
# -*- coding: utf-8 -*-
def f():
    print locals()    
dx = 0.1    
print "Вызов из глобальной области: ", 
f()
def ff():
    dx = 1.0
    f()
print "Вызов из функции: ",
ff()

Вывод:
Вызов из глобальной области:  {}
Вызов из функции: {}
Rodegast
Передавай locals как параметр:
 >>> X = 0
>>> def foo():
...     X = 1
...     def y(ns):
...         print ns
...     y(locals())
>>> foo()
{'y': <function y at 0x7fb3f7a2eb18>, 'X': 1}
alien308
Задача как раз уйти от передачи кучи редко меняющихся аргументов. С которыми надо возится при использовании функции как аргумента функции. Придётся костыли использовать - передавать эти данные как атрибуты функции.
sander
alien308
тогда модуль inspect
doza_and
alien308
Необходимо внутри функции определить есть ли данная переменная в пространстве имён вызывающего контекста
Насколько я понимаю в питоне не то что определить их наличие но и вообще нельзя получить к ним доступ.
(если не использовать сильно действующие средства типа inspect).
alien308
Задача как раз уйти от передачи кучи редко меняющихся аргументов.
Это вообще классика, с которой начинают изучение функций в питоне.
например:
 def f1():
    x=3
    f2(**locals())
def f2(**args):
    print(args["x"])
f1()

alien308
Придётся костыли использовать - передавать эти данные как атрибуты функции.
Интересно посмотреть как вы собираетесь это делать. Питон это не javascript :)

Если много неизменных аргументов, обычно принято определять функцию со значениями по умолчанию.
Если эти перечни меняются то используют классы…
alien308
Вот так:
 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import scipy as sp
import math
from scipy.stats import genpareto
def minim(a, b, y):
    l = len(a); dx = minim.dx
    for i in range(100):
        dr = (sp.rand(l) - 0.5)*dx*sp.rand()*genpareto.rvs(0.2, size=1)[0]
        y0 = y(a)
        a1 = a + dr*b
        y1 = y(a1)
        d = y1 - y0
        print i, a, a1, y0, y1, d
        if d < 0.0:
            a = a1
        pass
minim.dx = 0.5
def f(a):
    x = a[0];   y = a[1];
    return x*math.exp(x) - (1.0 + math.exp(x))*math.sin(y) 
a = np.array([0.0, 0.0])
b = np.array([1.0, 0.0])
minim(a, b, f)
Хочу чтобы параметры волшебством передавались.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB