参数里面有一个星号是什么意思?

2016-10-15 10:31:34 +08:00
 zungmou

如下代码:

def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET):
    pass

参数里面的 * 有什么意义?

5540 次点击
所在节点    Python
18 条回复
Famio
2016-10-15 10:34:01 +08:00
指针类型?
zungmou
2016-10-15 10:37:21 +08:00
@Famio python 没有指针的...
Technetiumer
2016-10-15 10:38:14 +08:00
可变参数?
chroming
2016-10-15 10:42:44 +08:00
确定不是写错了?
zungmou
2016-10-15 10:43:21 +08:00
我把它的全部代码贴出来,这是 configparser 模块里用于读取 Ini 文件的 get 方法。

```python
def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET):
"""Get an option value for a given section.

If `vars' is provided, it must be a dictionary. The option is looked up
in `vars' (if provided), `section', and in `DEFAULTSECT' in that order.
If the key is not found and `fallback' is provided, it is used as
a fallback value. `None' can be provided as a `fallback' value.

If interpolation is enabled and the optional argument `raw' is False,
all interpolations are expanded in the return values.

Arguments `raw', `vars', and `fallback' are keyword only.

The section DEFAULT is special.
"""
try:
d = self._unify_values(section, vars)
except NoSectionError:
if fallback is _UNSET:
raise
else:
return fallback
option = self.optionxform(option)
try:
value = d[option]
except KeyError:
if fallback is _UNSET:
raise NoOptionError(option, section)
else:
return fallback

if raw or value is None:
return value
else:
return self._interpolation.before_get(self, section, option, value,
d)
```
Sylv
2016-10-15 10:43:30 +08:00
Parameters after “*” or “*identifier ” are keyword-only parameters and may only be passed used keyword arguments.

http://stackoverflow.com/questions/2965271/forced-naming-of-parameters-in-python/14298976#14298976
xiahei
2016-10-15 10:45:18 +08:00
没有报错?
Chappako
2016-10-15 10:45:59 +08:00
zungmou
2016-10-15 10:48:32 +08:00
@xiahei
@chroming
是 python 自带库的代码,所以不可能有错。


@Sylv
@Chappako
感谢俩位的回答,小弟英语一般,能再问一句如何理解 "Keyword-Only Arguments",只允许传入关键字?
3b295
2016-10-15 10:49:16 +08:00
百度 Keyword-Only , 你的例子 * 作用和 *_ 一样吧,不过 * 可以这样用
def get(self, section, option, *, raw, vars, fallback):
pass
传参时,*后面的 raw 这些必须强制性传入
get(section, option, raw=False, vars=None, fallback=_UNSET):
zungmou
2016-10-15 10:55:39 +08:00
@3b295
非常感谢, Google 后基本明白使用方法,在此总结一下:

参数中如果有单独的星号,则表示星号后面的关键字必须强制性的以 identifier=value 的形式传入,并且必须传入,可参照 @3b295 的回答,我不知道这样做的目的是什么,是为了代码的可读性更强?
ryd994
2016-10-15 10:56:40 +08:00
@zungmou 普通的话,你数参数个数,从左往右一个个对应。
*会捕捉所有没有名字的参数,所以*后面的必须明确指明名字,而不能靠位置来匹配。
Sylv
2016-10-15 11:20:07 +08:00
@zungmou 并没有说星号后的参数是必须传入的,如果后面的参数有默认值,是可以省略的。
3b295
2016-10-15 13:21:25 +08:00
@zungmou 刚刚开了一下电脑, 试了一下, 我发现我之前的说法错了。

1. keyword-only argument 指的应该是
func(a,b,c,*args, b) 这种用法。
def func(a,b,c,*args, d):
pass

调用时 d 必须用=的样子传入
func(1,2,3,4)
TypeError: func() missing 1 required keyword-only argument: 'd'

*args 换成 *: func(a,b,c,*,b) 也是一样的



2.但是楼主给的例子根本没有 keyword-only argument 的使用
如果是
def get(self, section, option, *args, raw=False, vars=None, fallback=_UNSET):
pass
楼主一定能看懂吧。
那直接来看 * 和 *args 的区别吧。
def func1(a,b,c,*args, d):
pass

func1(1,2,3,4,5,6,7,d=8)
# 4 , 5 , 6 , 7 会匹配*args args=[4,5,6,7]

def func2(a,b,c,*,d):
pass

func2(1,2,3,4,5,6,7,d=8)
# 4 , 5 , 6 , 7 会匹配* 报错
> TypeError: func2() takes 3 positional arguments but 7 positional arguments (and
1 keyword-only argument) were given


参数里面的 * 有什么意义?
我觉得是为了规范吧。

def get(self, section, option, raw=False, vars=None, fallback=_UNSET):
pass
你可以偷懒 get(section, option, False, None, _UNSET) 这样调用调用


def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET):
pass
你只有老老实实的 get section, option, raw=False, vars=None, fallback=_UNSET)



ps :之前的回答没斟酌,希望不要误导了。 V2EX 好像不能改原来的回复了。就再回一贴了。还有我理解错误的地方欢迎指出(>.<)
firekiller
2016-10-15 21:22:27 +08:00
命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034eb82ac80a3e64b9bb4929b16eeed1eb9000
StarBrilliant
2016-10-16 08:09:53 +08:00
@3b295
请问你用的是不是 Python 2 ?
def f(a, b, *, c) 这种语法是 Python 3 新加的。
所以请更新到最新版 Python 。
zhuangzhuang1988
2016-10-16 21:23:01 +08:00
查看下 effective python
21. Enforce Clarity with Keyword-Only Arguments
dxandlight
2016-10-19 11:05:49 +08:00
这是 python3 里面强制传入 key 参数的用法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/312952

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX