社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何跳过python中*args之前的默认参数[duplicate]

Santhi Batchu • 4 年前 • 1182 次点击  

我试着用 args kwargs 在Python3(Python3.7.0)中,但我的理解遇到了一些问题。

这里有一个简单的函数:

def add_args(y=10, *args, **kwargs):
    return y, args, kwargs

并测试它以查看返回的内容:

    print(add_args(1, 5, 10, 20, 50))
    print(add_args())
    >>
    (1, (5, 10, 20, 50), {}) # What happened to my default y=10?
    (10, (), {})

我不明白的是,发生了什么 y=10 在第一份书面声明中?我可以看到它被 1 在里面 阿尔茨海默病 但我不确定为什么。

如何重写此函数以使默认值不被重写,或者我是否遗漏了一些参数如何从函数签名传递到return语句的内容?

我试着找 here here 但没有找到我想要的答案。我想把默认值放在 阿尔茨海默病 关键字参数 将防止覆盖。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39674
 
1182 次点击  
文章 [ 2 ]  |  最新文章 4 年前
bipll
Reply   •   1 楼
bipll    5 年前

隐马尔可夫模型, y 是函数定义中的第一个位置参数,因此它自然绑定到callsite中的第一个实际位置参数,即1。

Martijn Pieters
Reply   •   2 楼
Martijn Pieters    5 年前

*args 仅捕获未另行定义的任何位置参数; y=10 并不意味着 y 不能用作位置参数。所以 Y 指定第一个位置参数。

你可以阻止 Y 通过使其成为 keyword-only argument . 你这样做是通过提出论点 之后 这个 *精氨酸 var positional catch all参数,或者如果没有 *name 参数,在 * 单个星号:

def add_args(*args, y=10, **kwargs):
    return y, args, kwargs

def keyword_only_args(*, y=10, **kwargs):
    return y, kwargs

现在 Y 将不再捕获位置参数:

>>> def add_args(*args, y=10, **kwargs):
...     return y, args, kwargs
...
>>> add_args(1, 5, 10, 20, 50)
(10, (1, 5, 10, 20, 50), {})          # y is still 10
>>> add_args(1, 5, 10, 20, 50, y=42)  # setting y explicitly 
(42, (1, 5, 10, 20, 50), {})

你不需要 **kwargs 关键字catch all要么:

def add_args(*args, y=10):
    return y, args

但如果它存在,它需要列在最后。

仅限关键字的参数不必具有默认值, =10 可以省略,但随后该参数变为必需的,并且只能通过使用 y=value :

>>> def add_args(*args, y):  # mandatory keyword-only argument
...     return y, args
...
>>> add_args(1, 5, 10, 20, 50)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add_args() missing 1 required keyword-only argument: 'y'
>>> add_args(1, 5, 10, 20, 50, y=42)
(42, (1, 5, 10, 20, 50))