在函数的默认参数中添加一个参数?

时间:2018-01-19 20:33:29

标签: python python-3.x default-arguments

我想知道是否有办法在函数的默认参数中添加参数。

例如:

SOME_CITIES = ["Gotham","Chicago"]
def do_something(name, cities=SOME_CITIES):
    for city in cities:
        print(name, city)

do_something("Clark")
>> Clark Gotham
>> Clark Chicago

# Can I do something like this (pseudocode, obviously):
do_something("Clark", *["New York", "LA"])
>> Clark Gotham
>> Clark Chicago
>> Clark New York
>> Clark LA

我的想法是do_something("Clark", *"New York")将贯穿该功能,执行GothamChicago然后我添加的城市New York

这与我对**kwargs的理解相似,但看起来像是:

def do_something(name, **kwargs):
    # Code here...

do_something("Clark", SOME_CITIES, "New York")

但这需要我回想一下发送SOME_CITIES,当我想默认包含它时。这有意义吗?

编辑:SOME_CITIES可能并不总是列表。它可以是两个函数,即SOME_FUNCTIONS = func1, func2。此外 - 由于一些答案似乎在下面,如果这是一个坏主意,而kwargs / args更好,那也很好,只是让我知道并解释一下:)< / p>

2 个答案:

答案 0 :(得分:2)

Python没有扩展用作默认参数的列表的语法或行为,没有。你可以在这里简单地使用*args catch-all参数并在函数中连接

SOME_CITIES = ("Gotham", "Chicago")
def do_something(name, cities=SOME_CITIES, *further_cities):
    for city in cities + further_cities:
        print(name, city)

如果序列预计很大,您可以使用itertools.chain()而不是连接。注意这里使用元组的更改,这避免了使用可变数据类型的常见缺陷,在这种情况下,您永远不打算在运行时更改值。

使用列表作为默认参数值时需要非常小心,请参阅"Least Astonishment" and the Mutable Default Argument。在这个特定的情况中避免它是没有意义的,因为SOME_CITIES也是在函数之外定义的,你有更多的选项来改变那个对象,但你可能想考虑使用{ {1}}哨兵:

None

答案 1 :(得分:1)

您可以将函数中的默认参数更改为*args,然后使用functools.partial

import functools
SOME_CITIES = ["Gotham","Chicago"]
OTHER_CITIES = ["New York", "LA"]
def do_something(name, *cities):
  for city in cities:
     print(name, city)

new_funct = functools.partial(do_something, 'clark', *SOME_CITIES)
new_funct(*OTHER_CITIES)

输出:

clark Gotham
clark Chicago
clark New York
clark LA