python - 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 中,处理此问题的适当方法是什么?全局变量只是这里的答案吗?如果有很多函数被调用,那么将它作为函数参数传递数十次似乎也不是很有条理。
解决方案
您可以将该代码放在其自己的名为 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.py
和tdepend.py
import reddit.py
,它们都将使用完全相同的 reddit 对象。
仅供参考,您可以使用以下内容查看您距离达到 Reddit 的 API 限制有多近:praw.models.Auth(reddit).limits()
.
推荐阅读
- c++ - 为什么 C++ 中的重命名函数不起作用?
- python - re_path 未解析的正则表达式 (\d[1,2])
- javascript - 如何在一个函数中进行 switch 和 if 语句
- node.js - Mongoose - 按特定顺序按字符串字段自定义排序
- javascript - Forward Ref 将当前值设为 null
- go - 不能在赋值中使用 &ingredients (type *[]foo.bar) 作为 type []*foo.bar
- ruby - Ruby 中的 @__instance__ 是什么?
- javascript - React Material UI 包装 TableRow
- maven - 在 Payara Micro 上部署 War 时找不到 Derby JDBC 驱动程序
- arrays - 从指向 C 中结构的指针数组中获取信息