如下代码:
def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET):
pass
参数里面的 * 有什么意义?
1
Famio 2016-10-15 10:34:01 +08:00
指针类型?
|
3
Technetiumer 2016-10-15 10:38:14 +08:00 via Android
可变参数?
|
4
chroming 2016-10-15 10:42:44 +08:00
确定不是写错了?
|
5
zungmou OP 我把它的全部代码贴出来,这是 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) ``` |
6
Sylv 2016-10-15 10:43:30 +08:00 1
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 |
7
xiahei 2016-10-15 10:45:18 +08:00
没有报错?
|
8
Chappako 2016-10-15 10:45:59 +08:00
|
9
zungmou OP |
10
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): |
11
zungmou OP |
12
ryd994 2016-10-15 10:56:40 +08:00
@zungmou 普通的话,你数参数个数,从左往右一个个对应。
*会捕捉所有没有名字的参数,所以*后面的必须明确指明名字,而不能靠位置来匹配。 |
14
3b295 2016-10-15 13:21:25 +08:00 1
@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 好像不能改原来的回复了。就再回一贴了。还有我理解错误的地方欢迎指出(>.<) |
15
firekiller 2016-10-15 21:22:27 +08:00
命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了 http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034eb82ac80a3e64b9bb4929b16eeed1eb9000 |
16
StarBrilliant 2016-10-16 08:09:53 +08:00 via Android
|
17
zhuangzhuang1988 2016-10-16 21:23:01 +08:00 via iPad
查看下 effective python
21. Enforce Clarity with Keyword-Only Arguments |
18
dxandlight 2016-10-19 11:05:49 +08:00
这是 python3 里面强制传入 key 参数的用法。
|