gpt4 book ai didi

python - 学习Python;我怎样才能使它更像 Pythonic?

转载 作者:太空狗 更新时间:2023-10-30 01:39:24 25 4
gpt4 key购买 nike

我是一名探索外部世界的 PHP 开发人员。我决定开始学习 Python。

下面的脚本是我第一次尝试将 PHP 脚本移植到 Python。它的工作是从 Redis 存储中获取推文。这些推文来自 Twitter 的 Streaming API,并存储为 JSON 对象。然后提取所需的信息并将其转储到 CSV 文件中,以便使用托管在不同服务器上的 LOAD DATA LOCAL INFILE 导入 MySQL。

所以,问题是:现在我已经运行了我的第一个 Python 脚本,我怎样才能让它更像 Pythonic?你们有什么建议吗?让它变得更好?我应该知道的技巧?有建设性的批评?

更新:到目前为止已经采纳了大家的建议,这里是更新版本:
更新 2: 通过 pylint 运行代码。现在得分为 9.89/10。还有其他建议吗?

# -*- coding: utf-8 -*-
"""Redis IO Loop for Tweelay Bot"""
from __future__ import with_statement

import simplejson
import re
import datetime
import time
import csv
import hashlib

# Bot Modules
import tweelay.red as red
import tweelay.upload as upload
import tweelay.openanything as openanything

__version__ = "4"

def process_tweets():
"""Processes 0-20 tweets from Redis store"""
data = []
last_id = 0
for i in range(20):
last = red.pop_tweet()
if not last:
break

t = TweetHandler(last)
t.cleanup()
t.extract()

if t.get_tweet_id() == last_id:
break

tweet = t.proc()
if tweet:
data = data + [tweet]
last_id = t.get_tweet_id()

time.sleep(0.01)

if not data:
return False

ch = CSVHandler(data)
ch.pack_csv()
ch.uploadr()

source = "http://bot.tweelay.net/tweets.php"
openanything.openAnything(
source,
etag=None,
lastmodified=None,
agent="Tweelay/%s (Redis)" % __version__
)

class TweetHandler:
"""Cleans, Builds and returns needed data from Tweet"""
def __init__(self, json):
self.json = json
self.tweet = None
self.tweet_id = 0
self.j = None

def cleanup(self):
"""Takes JSON encoded tweet and cleans it up for processing"""
self.tweet = unicode(self.json, "utf-8")
self.tweet = re.sub('^s:[0-9]+:["]+', '', self.tweet)
self.tweet = re.sub('\n["]+;$', '', self.tweet)

def extract(self):
"""Takes cleaned up JSON encoded tweet and extracts the datas we need"""
self.j = simplejson.loads(self.tweet)

def proc(self):
"""Builds the datas from the JSON object"""
try:
return self.build()
except KeyError:
if 'delete' in self.j:
return None
else:
print ";".join(["%s=%s" % (k, v) for k, v in self.j.items()])
return None

def build(self):
"""Builds tuple from JSON tweet"""
return (
self.j['user']['id'],
self.j['user']['screen_name'].encode('utf-8'),
self.j['text'].encode('utf-8'),
self.j['id'],
self.j['in_reply_to_status_id'],
self.j['in_reply_to_user_id'],
self.j['created_at'],
__version__ )

def get_tweet_id(self):
"""Return Tweet ID"""
if 'id' in self.j:
return self.j['id']

if 'delete' in self.j:
return self.j['delete']['status']['id']


class CSVHandler:
"""Takes list of tweets and saves them to a CSV
file to be inserted into MySQL data store"""
def __init__(self, data):
self.data = data
self.file_name = self.gen_file_name()

def gen_file_name(self):
"""Generate unique file name"""
now = datetime.datetime.now()

hashr = hashlib.sha1()
hashr.update(str(now))
hashr.update(str(len(self.data)))

hash_str = hashr.hexdigest()
return hash_str+'.csv'

def pack_csv(self):
"""Save tweet data to CSV file"""
with open('tmp/'+self.file_name, mode='ab') as ofile:
writer = csv.writer(
ofile, delimiter=',',
quotechar='"',
quoting=csv.QUOTE_MINIMAL)
writer.writerows(self.data)

def uploadr(self):
"""Upload file to remote host"""
url = "http://example.com/up.php?filename="+self.file_name
uploadr = upload.upload_file(url, 'tmp/'+self.file_name)
if uploadr[0] == 200:
print "Upload: 200 - ("+str(len(self.data))+")", self.file_name
print "-------"
#os.remove('tmp/'+self.file_name)
else:
print "Upload Error:", uploadr[0]

if __name__ == "__main__":
while True:
process_tweets()
time.sleep(1)

最佳答案

代替:

  i=0
end=20
last_id=0
data=[]
while(i<=end):
i = i + 1
...

代码:

  last_id=0
data=[]
for i in xrange(1, 22):
...

相同的语义,更紧凑和 Pythonic。

代替

if not last or last == None:

只做

if not last:

None无论如何都是假的(所以 not lastTruelastNone). In general, when you want to check if something is None , code 是 None , not == None`。

  if(j['id'] <> last_id):

去掉多余的括号和过时的<>运算符和代码代替

  if j['id'] != last_id:

并从其他 if 中删除多余的括号声明。

代替:

  if len(data) == 0:

代码:

  if not data:

因为任何空容器都是假的。

hash_str = str(hash.hexdigest())

改为代码

hash_str = hash.hexdigest()

因为该方法已经返回一个字符串,所以 str调用冗余。

代替:

  for item in data:
writer.writerow(item)

使用

  writer.writerows(data)

代表你执行循环。

代替

  ofile = open('tmp/'+file_name, mode='ab')
...
ofile.close()

使用(在 Python 2.6 或更高版本中,或在 2.5 中通过使用 启动模块

  from __future__ import with_statement

“从 future 导入”with语句特征):

  with open('tmp/'+file_name, mode='ab') as ofile:
...

保证为您关闭(包括在可能引发异常的情况下)。

代替

print "Upload Error: "+uploadr[0]

使用

print "Upload Error:", uploadr[0]

其他print也类似statements -- 逗号为您插入一个空格。

我敢肯定还有更多这样的小东西,但有一些是我在扫描您的代码时“跳入眼帘”的。

关于python - 学习Python;我怎样才能使它更像 Pythonic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384010/

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