У меня есть сценарий с именем «helper.py», и у меня есть сценарий с именем «model.py».
По сути, helper.py может сохранять параметры в файл, я просто распечатаю эту функцию здесь. «model.py» может создавать 10 параметров.
Вот что мне снится:
# helper.py
def save():
print(a1)
print(a2)
......
# model.py
# (here get the parameters a1 a2....)
from helper import save
save() # how neat it looks like!
Это пойдет не так, потому что параметры не отображаются в helper.py. Итак, о чем я мечтаю, так это о том, что я хочу распечатать все эти параметры, указанные выше. (Вместо того, чтобы написать функцию следующим образом:)
# helper second edition.py
def save(a1, a2, a3, ...): # this seems not efficient
print(a1)
print(a2)
......
Или это как раз тот случай, который не подходит для вызова хелперов из других скриптов? Потому что функции должны нуждаться в параметрах в своем скрипте?
Спасибо за ваше время и вашу помощь.
Вы можете использовать def save(*args): ...
для захвата переменного количества аргументов.
@ThierryLathuille Привет, я это понимаю, но боюсь, что будет беспорядок, если мне нужно будет сохранить их в файл. Я имею в виду, что было бы проще не использовать функцию, просто написать код для каждой из них. Может я ошибаюсь...
Вы можете использовать аргументы ключевого слова, например:
>>> def save(**kwargs):
... print(kwargs['a1'])
... print(kwargs['a2'])
...
>>> save(**{'a1': 'foo', 'a2': 'bar'})
foo
bar
См. также *args и **kwargs в python объяснили
Спасибо за ваше время! Я действительно новичок, чтобы забыть эту функцию. Я обнаружил, что с ними можно делать разные вещи: например: print (a1), f.write("это второй {}.".format(a2))... и т.д.
Вам все равно нужно будет передать аргументы в функцию. Но, как заметил a_guest и как вы упомянули, есть два способа сделать это:
*args
или **kwargs
. *args
предоставит вам функцию, которая может принимать любое количество позиционных параметров (например, вызов foo(1, 2, 3, 4, 5)
или foo(1,2,3)
). Альтернативой может быть использование **kwargs
, которое предоставляет неограниченное количество (различных) аргументов ключевого слова (KeyWord, следовательно, _kw_args). Вместо этого это будет выглядеть как foo(key1 = "val1", key2 = "val2")
. Или, в зависимости от ваших потребностей, вы можете использовать оба. Код ниже демонстрирует этоdef save(*args, **kwargs):
if len(args) > 0:
print("Got passed positional arguments: {}".format(args))
if len(kwargs) > 0:
for k, v in kwargs.items(): # iter_items if python 2
print("Got passed keyword arguments: {}:{}".format(k, v) )
Пара замечаний:
1. *args
будет обрабатывать ввод как список
2. **kwargs
будет рассматривать ввод как словарь
Спасибо за объяснение, ваше объяснение очень дополняет и полезно для меня, чтобы понять! Я буду исследовать больше этого. Спасибо!
Это правильный и самый чистый способ сделать это:
# helper.py
def save(*args):
for arg in args:
print(arg)
# model.py
from helper import save
a1, a2, a3 = "foo", "bar", "baz"
save(a1, a2, a3)
Но это только в том случае, если вы хотите вызывать функцию с различным количеством аргументов. Если вы всегда передаете одинаковое количество аргументов, то лучше всего просто определить функцию, которая всегда будет принимать их все:
def save(a1, a2, a3):
...
Спасибо за ответы! что, если я хочу, чтобы функция делала разные вещи с параметрами? Например: print (a1), f.write("это второй {}.".format(a2))... и т.д.
@rewove Если у вас всегда одинаковое количество аргументов, то лучше просто определить функцию, которая всегда будет принимать их все def save(a1, a2, a3):
.
@rewove, что вы могли бы сделать вот так: print(args[0]); f.write("second arg".format(args[1]))
Явная передача параметров делает ваш код более понятным и простым в обслуживании.