Ссылаться на конкретный параметр по объекту в массиве?
Так что я действительно не знаю, как сформулировать этот вопрос, или я уверен, что могу просто погуглить.
У меня есть такая функция, как:
def example(parameter1 = "", parameter2 = "", parameter3 =""):
print(parameter1)
print(parameter2)
print(parameter3)
И я хочу иметь возможность, скажем, вызвать его 3 раза и передать сразу только один параметр, такой как:
example(parameter1 = "Hello")
example(parameter2 = "Stack")
example(parameter3 = "Overflow")
Но в моем реальном коде мне нужно обобщить это и иметь гораздо больше параметров, поэтому я хочу иметь возможность делать что-то вроде:
paramnames = ['parameter1', 'parameter2', 'parameter3']
parameters = ['Hello', 'Stack', 'Overflow']
for i in range(3):
example(paramnames[i] = parameters[i])
Есть ли способ в Python, чтобы сделать это?
4 ответа
То, что вы ищете, называется упаковкой аргументов и использует *
или же **
обозначить позиционные и именованные аргументы:
paramnames = ['parameter1', 'parameter2', 'parameter3']
parameters = ['Hello', 'Stack', 'Overflow']
for name, value in zip(paramnames, parameters):
example(**{name: value})
def example(parameter1="", parameter2="", parameter3=""):
print(parameter1)
print(parameter2)
print(parameter3)
Имейте в виду, что если аргумент не будет передан, он будет использоваться по умолчанию. Итак, вывод:
Hello
Stack
Overflow
Использовать dict
и **
обозначения:
parameters = {'parameter1': 'Hello',
'parameter2': 'Stack',
'parameter3': 'Overflow'}
for k, v in parameters.items():
example(**{k: v})
Если вам нужно сохранить порядок, используйте OrderedDict
Есть несколько способов сделать это.
Наиболее простой способ - использовать словарь для хранения аргументов, прежде чем передать их все функции, используя example(**param_dict)
,
Более "причудливый" подход будет использовать functools.partial
вызываемому объекту с заранее заданными параметрами. Вы бы сделали что-то вроде example = partial(example, parameter1="hello")
чтобы добавить параметры, просто позвоните example()
в конце. Этот подход может быть полезен, если параметры поступают из разных мест, и вам нужно некоторое время сохранять функцию с ее параметрами, как при обратном вызове.
Почему бы не использовать такие слова:
paramnames = ['parameter1', 'parameter2', 'parameter3']
parameters = ['Hello', 'Stack', 'Overflow']
for i in range(3):
example({paramnames[i] : parameters[i]})
а также:
def example(para_dict):
for k,v in para_dict.items():
print(v)
если вы хотите использовать каждый параметр в другом коде, вы можете протестировать на "k"