gpt4 book ai didi

python - 为什么Python每次都在__main__之外运行代码?

转载 作者:行者123 更新时间:2023-12-01 04:31:57 26 4
gpt4 key购买 nike

我只是想知道 Python 的行为以及它是如何工作的。我有一个脚本来运行并收集帐户的所有关注者和 friend 。

这是代码。

#!/usr/bin/env python
import pymongo
import tweepy

from pymongo import MongoClient

from sweepy.get_config import get_config

config = get_config()

consumer_key = config.get('PROCESS_TWITTER_CONSUMER_KEY')
consumer_secret = config.get('PROCESS_TWITTER_CONSUMER_SECRET')
access_token = config.get('PROCESS_TWITTER_ACCESS_TOKEN')
access_token_secret = config.get('PROCESS_TWITTER_ACCESS_TOKEN_SECRET')

MONGO_URL = config.get('MONGO_URL')
MONGO_PORT = config.get('MONGO_PORT')
MONGO_USERNAME = config.get('MONGO_USERNAME')
MONGO_PASSWORD = config.get('MONGO_PASSWORD')

client = MongoClient(MONGO_URL, int(MONGO_PORT))

print 'Establishing Tweepy connection'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True, retry_count=3)

db = client.tweets
db.authenticate(MONGO_USERNAME, MONGO_PASSWORD)

raw_tweets = db.raw_tweets
users = db.users

def is_user_in_db(screen_name):
return get_user_from_db(screen_name) is None

def get_user_from_db(screen_name):
return users.find_one({'screen_name' : screen_name})

def get_user_from_twitter(user_id):
return api.get_user(user_id)

def get_followers(screen_name):
users = []
for i, page in enumerate(tweepy.Cursor(api.followers, id=screen_name, count=200).pages()):
print 'Getting page {} for followers'.format(i)
users += page
return users

def get_friends(screen_name):
users = []
for i, page in enumerate(tweepy.Cursor(api.friends, id=screen_name, count=200).pages()):
print 'Getting page {} for friends'.format(i)
users += page
return users

def get_followers_ids(screen_name):
ids = []
for i, page in enumerate(tweepy.Cursor(api.followers_ids, id=screen_name, count=5000).pages()):
print 'Getting page {} for followers ids'.format(i)
ids += page

return ids

def get_friends_ids(screen_name):
ids = []
for i, page in enumerate(tweepy.Cursor(api.friends_ids, id=screen_name, count=5000).pages()):
print 'Getting page {} for friends ids'.format(i)
ids += page
return ids

def process_user(user):
screen_name = user['screen_name']

print 'Processing user : {}'.format(screen_name)

if is_user_in_db(screen_name):
user['followers_ids'] = get_followers_ids(screen_name)
user['friends_ids'] = get_friends_ids(screen_name)

users.insert_one(user)
else:
print '{} exists!'.format(screen_name)

print 'End processing user : {}'.format(screen_name)

if __name__ == "__main__":

for doc in raw_tweets.find({'processed' : {'$exists': False}}):
print 'Start processing'
try:
process_user(doc['user'])
except KeyError:
pass

try:
process_user(doc['retweeted_status']['user'])
except KeyError:
pass

raw_tweets.update_one({'_id': doc['_id']}, {'$set':{'processed':True}})

我不断从日志中得到的是

Rate limit reached. Sleeping for: 889
Establishing Tweepy connection
Start processing
Processing user : littleaddy80
Establishing Tweepy connection
Start processing
Processing user : littleaddy80
Establishing Tweepy connection
Start processing
Processing user : littleaddy80
Establishing Tweepy connection
Start processing
Processing user : littleaddy80
Rate limit reached. Sleeping for: 891

我想知道,因为 建立 Tweepy 连接 位于 __main__ 之外,并且它不应该一遍又一遍地运行。我只是想知道为什么 Python 会有这样的行为或者我的代码中有错误?

最佳答案

当您运行/导入 python 脚本时,其中的每个语句都会被执行(但是,导入时,只有在第一次导入模块或执行 reload(module) 时才会发生这种情况)。有一些通常存在的陈述需要注意:

  • 执行函数定义意味着函数正在被定义(而不是执行函数体)。
  • 执行 import 语句将导入模块。
  • 类定义的执行意味着它的主体被执行,它主要包含函数定义,因此它主要是定义函数。
  • 执行 if 语句意味着首先计算控制表达式,然后执行主体。
  • 执行赋值意味着 rhs 表达式的计算可能会产生副作用。

这就是为什么人们通常不会将代码直接放在 python 脚本的顶层 - 它将被执行。如果它既可以作为脚本又可以作为模块工作 - 作为脚本运行时应该运行的代码应该包含在 if __name__ == '__main__' 语句中。

除非您需要全局变量,否则您的脚本将是一堆函数定义和类定义,后跟:

if __name__ == "__main__":
code_to_be_executed_iff_run_as_a_script()
else:
code_to_be_executed_iff_imported()

如果您需要全局变量,有时必须特别小心,以避免在运行/导入模块时产生副作用。

关于python - 为什么Python每次都在__main__之外运行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32264134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com