Python:保留实例

Zen*_*eno 6 python python-3.x

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

import praw

reddit = praw.Reddit(client_id='my client id',
                     client_secret='my client secret',
                     user_agent='my user agent')
Run Code Online (Sandbox Code Playgroud)

哪个工作正常。

随着代码的增加,我创建了各种模块(.py文件),它的主要.py文件,其中main是进口他们进入。

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

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

wp-*_*com 6

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

reddit.py:

import praw

reddit = praw.Reddit(client_id='my client id',
                     client_secret='my client secret',
                     user_agent='my user agent')
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它。

some_other_module.py

import reddit

for submission in reddit.reddit.subreddit('learnpython').hot(limit=10):
    print(submission.title)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

日元

x = 1
Run Code Online (Sandbox Code Playgroud)

b.py

import j
j.x += 3
Run Code Online (Sandbox Code Playgroud)

py

import j
j.x += 5
Run Code Online (Sandbox Code Playgroud)

数字9将被打印出来,因为x在首次导入时才被设置为1。将来对模块的引用都使用相同的x。

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


仅供参考,您可以使用下面来看看你是达到reddit的的API限制的接近:praw.models.Auth(reddit).limits()