Итак, я создал функцию, которая применяет действие (в данном случае умножение точки массива с синусоидой, но это не имеет значения для моего вопроса), чтобы массив.Возвращает переменное имя извне функции, поскольку строка внутри функции python
Теперь я создал еще одну функцию, с помощью которой я хочу создать код python string
, чтобы применить первую функцию несколько раз позже. Ввод второй функции может быть либо 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
Wanted выход:
'functionONE(functionONE(somearray, 1, 3), 6, 5)'
Почему listoflistsofargs
берется из входной функции и var
нет? Я указываю var
в списке непонимания в определении functionTWO
. Обычно, когда я пользуюсь списками с функциями ввода, он работает нормально. Кто-нибудь знает, почему это не так? Заранее спасибо!
EDIT: Таким образом, я думаю, что ответ dont. Реализация классов Marcin выглядит намного чище и примерно того же порядка количества кода. Жаль, что я не мог заставить это работать внутри функции. Для других donts (на самом деле другие идеи) об использовании имен переменных в виде строк есть вопрос this, где я получил приведенное выше список имен переменных.
Почему бы вам просто не передать имя переменной функции? Это кажется гораздо менее печатающим, чем то, что вы пытаетесь сделать сейчас. Это также было бы более явным и менее подверженным ошибкам. –
@sybren Ну, я хотел быть в состоянии выполнить ту же функцию произвольно количество раз на множестве. Мне было глупо, что я могу легко ввести его в консоль, но я не знал, как легко сделать функцию, поэтому я просто создал функцию типа. Угадайте, что есть «лучшие» способы. Я пытаюсь их изучить :) – Leo