Python 分析访问细节,下面介绍两个分析函数,并使用它们来过滤和分析各个AccessDetails
对象。第一个filter()
函数只传递特定路径。第二个函数会汇总每个不同路径的出现频次。
下面定义一个小函数book_in_path()
,并结合内置的filter()
函数,用于分析细节。复合的book_filter()
函数如下所示:
from typing import Iterable, Iterator
def book_filter(
access_details_iter: Iterable[AccessDetails]
) -> Iterator[AccessDetails]:
def book_in_path(detail: AccessDetails) -> bool:
path = tuple(
item
for item in detail.url.path.split('/')
if item
)
return path[0] == 'book' and len(path) > 1
return filter(book_in_path, access_details_iter)
这样就通过book_in_path
函数定义了一条规则,并将其应用于每个AccessDetails
对象。如果路径名非空,且路径的一级属性是book
,那么我们会对这些对象感兴趣,其他所有AccessDetails
对象都会被静默排除。
我们最感兴趣的是reduce_book_total()
归约函数,如下所示:
from collections import Counter
def reduce_book_total(
access_details_iter: Iterable[AccessDetails]
) -> Dict[str, int]:
counts: Dict[str, int] = Counter()
for detail in access_details_iter:
counts[detail.url.path] += 1
return counts
该函数会生成一个Counter()
对象,用于显示AccessDetails
对象中每个路径出现的频率。可以使用reduce_total(book_filter(details))
方法关注某组的特定路径,它汇总了给定过滤器可接收的数据项。
由于Counter
对象适用于各类型,因此需要类型提示来缩小类型范围。在本例中,类型提示是Dict[str, int]
,它会告知mypy工具统计路径的字符串表示形式。