首页 > 解决方案 > Python:保留实例

问题描述

使用 PRAW,在我的主线程中,我创建了一个 Reddit 实例:

import praw

reddit = praw.Reddit(client_id='my client id',
                     client_secret='my client secret',
                     user_agent='my user agent')

哪个工作正常。

随着代码的增长,我创建了各种模块(.py文件),主.py文件将main它们导入其中。

有时这些其他模块需要访问上述实例,而不是创建一个只会浪费资源或 API 速率限制的新实例。

在 Python 3.6 中,处理此问题的适当方法是什么?全局变量只是这里的答案吗?如果有很多函数被调用,那么将它作为函数参数传递数十次似乎也不是很有条理。

标签: pythonpython-3.x

解决方案


您可以将该代码放在其自己的名为 reddit 的模块中

reddit.py:

import praw

reddit = praw.Reddit(client_id='my client id',
                     client_secret='my client secret',
                     user_agent='my user agent')

然后像这样使用它。

some_other_module.py

import reddit

for submission in reddit.reddit.subreddit('learnpython').hot(limit=10):
    print(submission.title)

Python 只会在第一次导入时运行模块中的代码,然后将模块保留在内部,以便在以后的导入中引用相同的模块。

你可以做一个小例子来看看这个是创建以下模块。

一个.py

import b # j.x is now 4
import c # j.x is now 9
import j # j.x is still 9
print(j.x) # 9 is printed out

日元

x = 1

b.py

import j
j.x += 3

py

import j
j.x += 5

数字 9 将被打印出来,因为 x 仅在第一次导入时设置为 1。未来对所有使用相同 x 的模块的引用。

在您的情况下,您可以拥有main.pytdepend.pyimport reddit.py,它们都将使用完全相同的 reddit 对象。


仅供参考,您可以使用以下内容查看您距离达到 Reddit 的 API 限制有多近:praw.models.Auth(reddit).limits().


推荐阅读