Итак, я создал функцию, которая применяет действие (в данном случае точечное умножение массива на синусоиду, но это не имеет значения для моего вопроса) к массиву.
Теперь я создал еще одну функцию, с помощью которой я хочу создать string
кода Python, чтобы позже применить первую функцию несколько раз. Вход второй функции может быть либо string
, либо array
, так что я могу использовать вторую функцию и на ее собственном выходе, если это необходимо. Мой метод получения имени переменной в строке работает вне функции.
Ввод:
var = np.array([[1,3],[2,4]]) # or sometimes var = 'a string'
if type(var)==str:
var_name = var
else:
var_name = [ k for k,v in locals().items() if v is var][0]
var_name
Вывод:
'var'
Итак, здесь var
— это переменная (массив или строка), переданная функции, в данном случае массив. Оператор if прекрасно возвращает мне его имя.
Однако, когда я использую это внутри своей функции, независимо от того, какой ввод я ей ввожу, на самом деле кажется, что он ищет var в locals(). Почему-то он не берет var из ввода функции.
Определение:
def functionTWO(var, listoflistsofargs=None):
if type(var)==str:
var_name = var
else:
var_name = [ k for k,v in locals().items() if v is var][0]
if listoflistsofargs==None:
return var_name
command = []
for i in range(len(listoflistsofargs)):
if i==0:
command.append('functionONE(')
command.append(var_name)
command.append(',%.17f, %.17f)' % tuple(listoflistsofargs[i]))
else:
command.insert(0,'functionONE(')
command.append(',%.17f, %.17f)' % tuple(listoflistsofargs[i]))
''.join(command)
command[0] = var_name + ' + ' + command[0]
return ''.join(command)
Ввод:
somearray = np.array([[1,2,3],[1,2,3],[1,2,3]])
args = [[1,3],[6,5]]
command = functionTWO(somearray, args)
command
Вывод:
NameError: name 'var' is not defined
Требуемый результат:
'functionONE(functionONE(somearray, 1, 3), 6, 5)'
Почему listoflistsofargs
берется из ввода функции, а var
нет? Я указываю var
в listcomprehension в определении functionTWO
. Обычно, когда я использую понимание списка с вводом функций, он работает нормально. Кто-нибудь знает, почему это не так здесь? Заранее спасибо!
EDIT: Так что я думаю, что ответ нельзя. Реализация классов Марсином выглядит намного чище и примерно того же порядка объема кода. Жаль, что я не мог заставить это работать внутри функции. Для других запретов (на самом деле других идей) об использовании имен переменных в виде строк есть этот вопрос, где я получил указанное выше понимание списка для имен переменных.