为什么 `submission.permalink` 与 PRAW 一起工作 - 即使我在源代码中找不到关于此属性的任何信息?

Why is `submission.permalink` with PRAW working - even if I can't find anything about this attribute in the source code?

我正在寻找一个包含提交标题的属性,该标题是提交永久链接的一部分。不幸的是,根据 PRAW 文档 http://praw.readthedocs.io/en/latest/search.html?q=permalink&check_keywords=yes&area=default

praw.models.reddit.submission.Submission 似乎不包含 permalink 属性

但是,如果我 运行

import praw
print(praw.__version__)
reddit = praw.Reddit(...)
for submission in reddit.subreddit("redditdev").hot(limit=5):
    print(type(submission), submission.permalink)

我会得到

4.4.0
<class 'praw.models.reddit.submission.Submission'> /r/redditdev/comments/77gz1m/new_mobile_friendly_reddit_search_is_now_in_beta/
<class 'praw.models.reddit.submission.Submission'> /r/redditdev/comments/77dkl6/can_anyone_explain_why_my_if_x_in_y_isnt_working/
<class 'praw.models.reddit.submission.Submission'> /r/redditdev/comments/77ci3v/ratelimit_you_are_doing_that_too_much/
<class 'praw.models.reddit.submission.Submission'> /r/redditdev/comments/77bak9/is_there_some_standard_way_to_host_bots/
<class 'praw.models.reddit.submission.Submission'> /r/redditdev/comments/77ci1v/praw_checking_if_my_bot_has_already_posted_in_a/

所以我对 permalink 的调用工作正常,即使 grepcomment.py 以外的源文件中找不到 permalink?!

$ grep -r -i -l "permalink" --include "*.py" /usr/local/lib/python3.6/dist-packages/praw/
/usr/local/lib/python3.6/dist-packages/praw/models/reddit/comment.py

与最新版本相同,如果您在 GitHub 上的源中搜索 permalinkhttps://github.com/praw-dev/praw/search?l=Python&q=permalink&type=&utf8=%E2%9C%93

这是怎么回事?属性从何而来?

PRAW 通过 API 动态提供 Reddit returns 的属性。由于这些属性在 Reddit 端可能会发生变化,因此 PRAW 不会努力记录它们,而是指导您如何发现可用的内容:

https://praw.readthedocs.io/en/latest/getting_started/quick_start.html#determine-available-attributes-of-an-object

当您迭代 reddit.subreddit("redditdev").hot(limit=5) 时,PRAW 向 https://oauth.reddit.com/r/redditdev/hot/.json?limit=5, which essentially returns the same data as https://www.reddit.com/r/redditdev/hot/.json?limit=5 发出请求。当访问后者 link 时,你应该看到 permalink 属性出现了 5 次,因为请求是针对 5 次提交的。您还将看到可用于提交对象的所有其他属性。