向函数的默认参数添加参数?

2024-04-20 04:27:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有一种方法可以在函数的默认参数中添加一个参数。你知道吗

例如:

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更好,那也没关系,让我知道并解释一下:)


Tags: 函数namenew参数defsomedosomething
2条回答

Python没有语法或行为来扩展用作默认参数的列表,没有。您只需在这里使用*argscatch 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也是在函数之外定义的,您有更多的选项来更改该对象,但是您可能需要考虑改用None哨兵:

SOME_CITIES = ["Gotham", "Chicago"]
def do_something(name, cities=None, *further_cities):
    if cities is None:
        # start with a base list
        cities = SOME_CITIES
    cities = cities + list(further_cities)
    for city in cities:
        print(name, city)

您可以将函数中的默认参数更改为*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

相关问题 更多 >