Что то такое:
def f(): if not (dx in внешние_переменные): dx = 0.01 . . . dx = 0.1 res = f()
Python 2.7
def f(): if not (dx in внешние_переменные): dx = 0.01 . . . dx = 0.1 res = f()
"dx" in f.__globals__
#!/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
locals()
#!/usr/bin/env python # -*- coding: utf-8 -*- def f(): print locals() dx = 0.1 print "Вызов из глобальной области: ", f() def ff(): dx = 1.0 f() print "Вызов из функции: ", ff()
Вызов из глобальной области: {}
Вызов из функции: {}
>>> X = 0 >>> def foo(): ... X = 1 ... def y(ns): ... print ns ... y(locals()) >>> foo() {'y': <function y at 0x7fb3f7a2eb18>, 'X': 1}
alien308Насколько я понимаю в питоне не то что определить их наличие но и вообще нельзя получить к ним доступ.
Необходимо внутри функции определить есть ли данная переменная в пространстве имён вызывающего контекста
alien308Это вообще классика, с которой начинают изучение функций в питоне.
Задача как раз уйти от передачи кучи редко меняющихся аргументов.
def f1(): x=3 f2(**locals()) def f2(**args): print(args["x"]) f1()
alien308Интересно посмотреть как вы собираетесь это делать. Питон это не javascript :)
Придётся костыли использовать - передавать эти данные как атрибуты функции.
#!/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)