Уведомления

Группа в Telegram: @pythonsu

#1 Июль 31, 2016 14:38:32

alien308
Зарегистрирован: 2012-06-23
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Посмотреть простанство имён вызывающего контекста

Необходимо внутри функции определить есть ли данная переменная в пространстве имён вызывающего контекста. dir() без аргументов возвращает только локальное пространство имён.
Что то такое:

 def f():
    if not (dx in внешние_переменные):
        dx = 0.01
    . . . 
dx = 0.1
res = f()

Python 2.7

Отредактировано alien308 (Июль 31, 2016 14:39:42)

Офлайн

#2 Июль 31, 2016 14:48:37

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2750
Репутация: +  184  -
Профиль   Отправить e-mail  

Посмотреть простанство имён вызывающего контекста

 "dx" in f.__globals__



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Июль 31, 2016 15:49:41

alien308
Зарегистрирован: 2012-06-23
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Посмотреть простанство имён вызывающего контекста

Не совсем то. Возвращается не пространство имён вызывающего контекста, а глобальное пространство имён.

 #!/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

Отредактировано alien308 (Июль 31, 2016 15:50:08)

Офлайн

#4 Июль 31, 2016 16:10:02

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2750
Репутация: +  184  -
Профиль   Отправить e-mail  

Посмотреть простанство имён вызывающего контекста

 locals()



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Июль 31, 2016 17:00:33

alien308
Зарегистрирован: 2012-06-23
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Посмотреть простанство имён вызывающего контекста

Нету его там, только локальные переменные.

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

Вывод:
Вызов из глобальной области:  {}
Вызов из функции: {}

Отредактировано alien308 (Июль 31, 2016 17:02:17)

Офлайн

#6 Июль 31, 2016 17:47:36

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2750
Репутация: +  184  -
Профиль   Отправить e-mail  

Посмотреть простанство имён вызывающего контекста

Передавай locals как параметр:

 >>> X = 0
>>> def foo():
...     X = 1
...     def y(ns):
...         print ns
...     y(locals())
>>> foo()
{'y': <function y at 0x7fb3f7a2eb18>, 'X': 1}



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Июль 31, 2016 18:00:29

alien308
Зарегистрирован: 2012-06-23
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Посмотреть простанство имён вызывающего контекста

Задача как раз уйти от передачи кучи редко меняющихся аргументов. С которыми надо возится при использовании функции как аргумента функции. Придётся костыли использовать - передавать эти данные как атрибуты функции.

Офлайн

#8 Июль 31, 2016 21:23:11

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Посмотреть простанство имён вызывающего контекста

alien308
тогда модуль inspect

Офлайн

#9 Июль 31, 2016 21:38:10

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Посмотреть простанство имён вызывающего контекста

alien308
Необходимо внутри функции определить есть ли данная переменная в пространстве имён вызывающего контекста
Насколько я понимаю в питоне не то что определить их наличие но и вообще нельзя получить к ним доступ.
(если не использовать сильно действующие средства типа inspect).
alien308
Задача как раз уйти от передачи кучи редко меняющихся аргументов.
Это вообще классика, с которой начинают изучение функций в питоне.
например:
 def f1():
    x=3
    f2(**locals())
def f2(**args):
    print(args["x"])
f1()

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

Если много неизменных аргументов, обычно принято определять функцию со значениями по умолчанию.
Если эти перечни меняются то используют классы…



Отредактировано doza_and (Июль 31, 2016 22:20:47)

Офлайн

#10 Июль 31, 2016 22:27:06

alien308
Зарегистрирован: 2012-06-23
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Посмотреть простанство имён вызывающего контекста

Вот так:

 #!/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)
Хочу чтобы параметры волшебством передавались.

Отредактировано alien308 (Июль 31, 2016 22:31:16)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version