Python中aosabook/500lines的guido爬虫代码里,__init__参数中单独的*是什么用法?
源码地址: https://github.com/aosabook/500lines/blob/master/crawler/code/crawling.py
第 53 行 loop=None 前面单独的星号是什么用法? google 找不到对应的答案(也可能是我没找对关键字)
Python中aosabook/500lines的guido爬虫代码里,__init__参数中单独的*是什么用法?
10 回复
在函数定义中,单独的 * 是一个参数分隔符,它用来强制要求其后的参数必须以关键字参数的形式传递。
在 aosabook/500lines 的 guido 爬虫代码的 __init__ 方法中,这个用法很典型。看个具体例子:
class SimpleCrawler:
def __init__(self, root_url, *, max_redirect=10, user_agent='wswp'):
self.root_url = root_url
self.max_redirect = max_redirect
self.user_agent = user_agent
# ... 其他初始化代码
# 这样调用是合法的:
crawler1 = SimpleCrawler('http://example.com')
crawler2 = SimpleCrawler('http://example.com', max_redirect=5)
crawler3 = SimpleCrawler('http://example.com', user_agent='mybot', max_redirect=5)
# 但这样调用会报错(因为 max_redirect 在 * 后面,必须用关键字参数):
# crawler4 = SimpleCrawler('http://example.com', 5) # TypeError!
关键点:
*前面的参数(如root_url)可以是位置参数或关键字参数。*后面的参数(如max_redirect,user_agent)必须以关键字参数形式指定。- 这样设计的好处是提高了代码的可读性和可维护性,尤其是在参数较多或含义容易混淆时,强制使用关键字参数能避免传参顺序错误。
这种语法在 Python 3 中引入,在定义接收多个可选配置参数的类初始化方法或函数时特别有用。
一句话总结:单独的 * 用来分隔位置参数和强制关键字参数。
keyword only parameter
那么他和 *args 和 **kwargs 有什么区别呢,怎么从中取值?
查到了,PEP3102 万分感谢
它的意思是后面的参数只能用关键字传参,不能用位置参数传参,,它本身没有值
感谢,看了下 PEP 好像有点懂了~
python3 新特性这是
3 语法有点太乱了…
我怎么觉得 3 的语法很先进呢…


