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 回复

class Crawler:
def init(self, roots,
exclude=None, strict=True, # What to crawl.
max_redirect=10, max_tries=4, # Per-url limits.
max_tasks=10, *, loop=None):

代码在这里


在函数定义中,单独的 * 是一个参数分隔符,它用来强制要求其后的参数必须以关键字参数的形式传递。

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!

关键点:

  1. * 前面的参数(如 root_url)可以是位置参数或关键字参数。
  2. * 后面的参数(如 max_redirect, user_agent必须以关键字参数形式指定。
  3. 这样设计的好处是提高了代码的可读性和可维护性,尤其是在参数较多或含义容易混淆时,强制使用关键字参数能避免传参顺序错误。

这种语法在 Python 3 中引入,在定义接收多个可选配置参数的类初始化方法或函数时特别有用。

一句话总结:单独的 * 用来分隔位置参数和强制关键字参数。

keyword only parameter

那么他和 *args 和 **kwargs 有什么区别呢,怎么从中取值?

查到了,PEP3102 万分感谢


它的意思是后面的参数只能用关键字传参,不能用位置参数传参,,它本身没有值

感谢,看了下 PEP 好像有点懂了~

python3 新特性这是

3 语法有点太乱了…

我怎么觉得 3 的语法很先进呢…

回到顶部