我想知道是否有办法在函数的默认参数中添加参数。
例如:
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")
将贯穿该功能,执行Gotham
,Chicago
和然后我添加的城市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>
答案 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