TypeError: в функции отсутствует обязательный позиционный аргумент при чтении аргументов из файла

Как передать значения переменных, определенные в файле JSON?

У меня есть эти две функции:

def fun1(a , b) : 
    print(a , b)

def fun2(c , d) : 
    print(c , d)


jsonfile = {    
    'function1' : {
        'callback' : 'fun1' , 
        'args' : ['a' , 'b']
    }, 
    'function2' : {
        'callback' : 'fun2',
        'args' : ['c' , 'd']
    }
}

# iter the json file looking for the function callback + the args to call them ..
for key , value in jsonfile.items() :
    function_name = value['callback']
    function_args = value['args']
    locals()[function_name](# how to pass the functions args ?? )

Когда я делаю:

locals()[function_name](function_args)

Я получаю следующую ошибку, потому что функция считает, что я передаю только 1 аргумент, а не 2:

   locals()[function_name](function_args)
TypeError: fun1() missing 1 required positional argument: 'b'

Какие-либо предложения?

Вы пробовали оператор *? docs.python.org/3/tutorial/…

Nick ODell 06.05.2022 03:49

Разве не должно быть globals()? Это не имеет значения вне функции, но если вы переместите код внутрь функции, он не будет работать.

Barmar 06.05.2022 03:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Список аргументов нужно распаковать:

locals()[function_name](*function_args)

Благодарю. но как можно преобразовать эти распакованные в переменные. что-то вроде этого a = 'var1' b = 'var2', поэтому вывод на печать будет var1 var2

CoderButBeginner 06.05.2022 04:06

Если вы измените формат json на 'args' : {'a': 'var1' , 'b': 'var2'}, вы можете распаковать с двумя звездочками, например [function_name](**function_args)

ahmed 06.05.2022 06:36

Вы можете использовать оператор распаковки на function_args:

for key , value in jsonfile.items() :
    function_name = value['callback']
    function_args = value['args']
    locals()[function_name](*function_args)

Это выводит:

a b
c d

опередить меня. Я собирался сказать, что список передается в функцию как один аргумент и его нужно распаковать.

Kaleba KB Keitshokile 06.05.2022 03:51

Благодарю. но как можно преобразовать эти распакованные в переменные. что-то вроде этого a = 'var1' b = 'var2', поэтому вывод на печать будет var1 var2

CoderButBeginner 06.05.2022 04:13
a, b = <list to unpack>
BrokenBenchmark 06.05.2022 05:05

Другие вопросы по теме