我开始研究Python及其设施。我只是试着用一些基础库制作一个简单的程序。
我想听听你注意到的任何事情-风格、可读性、安全性等。
#!/usr/bin/python2.6 -u
import urllib2
import simplejson
import zlib
from optparse import OptionParser
class StackOverflowFetcher:
"""Simple SO fetcher"""
def getUserInfo( self, userId ):
response = urllib2.urlopen( 'http://api.stackoverflow.com/1.1/users/' + str(userId) )
response = response.read()
jsonData = zlib.decompress( response, 16+zlib.MAX_WBITS )
return simplejson.loads( jsonData )
def getUserDisplayName( self, userId ):
return self.getUserInfo( userId )['users'][0]['display_name']
def getUserViewCount( self, userId ):
return self.getUserInfo( userId )['users'][0]['view_count']
def getUserReputation( self, userId ):
return self.getUserInfo( userId )['users'][0]['reputation']
if __name__ == '__main__':
parser = OptionParser()
parser.add_option("-u", "--userId", dest="userId", help="Set userId (default is 1)", default=1 )
parser.add_option("-n", "--display-name", action="store_true", dest="show_display_name", default=False, help="Show user's display name")
parser.add_option("-v", "--view_count", action="store_true", dest="show_view_count", default=False, help="Show user's profile page view count")
parser.add_option("-r", "--reputation", action="store_true", dest="show_reputation", default=False, help="Show user's reputation")
(options, args) = parser.parse_args()
userId = options.userId
show_display_name = options.show_display_name
show_view_count = options.show_view_count
show_reputation = options.show_reputation
if ( (not show_display_name) and (not show_view_count) and (not show_reputation) ):
show_display_name = show_view_count = show_reputation = True
fetcher = StackOverflowFetcher()
if ( show_display_name ) : print fetcher.getUserDisplayName( userId )
if ( show_view_count) : print fetcher.getUserViewCount( userId )
if ( show_reputation ) : print fetcher.getUserReputation( userId )Python版本2.6
发布于 2012-01-19 16:04:00
#!/usr/bin/python2.6 -u
import urllib2
import simplejson
import zlib
from optparse import OptionParser
class StackOverflowFetcher:
"""Simple SO fetcher"""
def getUserInfo( self, userId ):python样式指南推荐函数名和参数名为words_with_underscores。
response = urllib2.urlopen( 'http://api.stackoverflow.com/1.1/users/' + str(userId) )我会考虑将API转换为全局常量。
response = response.read()
jsonData = zlib.decompress( response, 16+zlib.MAX_WBITS )我会把前两行合并起来
return simplejson.loads( jsonData )
def getUserDisplayName( self, userId ):
return self.getUserInfo( userId )['users'][0]['display_name']
def getUserViewCount( self, userId ):
return self.getUserInfo( userId )['users'][0]['view_count']
def getUserReputation( self, userId ):
return self.getUserInfo( userId )['users'][0]['reputation']有三个函数共享它们的大部分代码。为什么不修改getUserInfo来代替“用户”本身呢?
if __name__ == '__main__':
parser = OptionParser()
parser.add_option("-u", "--userId", dest="userId", help="Set userId (default is 1)", default=1 )
parser.add_option("-n", "--display-name", action="store_true", dest="show_display_name", default=False, help="Show user's display name")
parser.add_option("-v", "--view_count", action="store_true", dest="show_view_count", default=False, help="Show user's profile page view count")
parser.add_option("-r", "--reputation", action="store_true", dest="show_reputation", default=False, help="Show user's reputation")
(options, args) = parser.parse_args()
userId = options.userId
show_display_name = options.show_display_name
show_view_count = options.show_view_count
show_reputation = options.show_reputation
if ( (not show_display_name) and (not show_view_count) and (not show_reputation) ):这些括号都没有必要。我可能会使用if not (show_display_name or show_view_count or show_reputation):,因为我认为大多数情况下都清楚地说明了您正在做的事情。show_display_name = show_view_count = show_reputation = True
fetcher = StackOverflowFetcher()
if ( show_display_name ) : print fetcher.getUserDisplayName( userId )
if ( show_view_count) : print fetcher.getUserViewCount( userId )
if ( show_reputation ) : print fetcher.getUserReputation( userId )首先,如果不需要父母。其次,编写代码的方式每次调用都会返回到服务器。因此,您将对堆栈溢出服务器进行三次调用,您可以使用其中一次调用。
发布于 2012-01-18 16:21:13
我认为您的命名方案是好的,乍一看,可以很容易地看出代码所做的事情,而不必对其进行过多的研究。
但是,如果我想说些什么,我会说:
发布于 2012-01-19 12:09:43
http://api.stackoverflow.com/1.1/users/string_id返回
{
"error": {
"code": 404,
"message": "The server has not found anything matching the Request-URI."
}
}并将KeyErrors带到这里:
def getUserDisplayName( self, userId ):
return self.getUserInfo( userId )['users'][0]['display_name']
def getUserViewCount( self, userId ):
return self.getUserInfo( userId )['users'][0]['view_count']
def getUserReputation( self, userId ):
return self.getUserInfo( userId )['users'][0]['reputation']http://api.stackoverflow.com/1.1/users/9924返回
{
"total": 0,
"page": 1,
"pagesize": 30,
"users": []
}并将IndexErrors带到这里:
def getUserDisplayName( self, userId ):
return self.getUserInfo( userId )['users'][0]['display_name']
def getUserViewCount( self, userId ):
return self.getUserInfo( userId )['users'][0]['view_count']
def getUserReputation( self, userId ):
return self.getUserInfo( userId )['users'][0]['reputation']由于您使用userId作为每个方法的参数,而且StackOverflowFetcher实例仅用于1 userId --添加__init__方法可能是个好主意:
__init__(self, userId):
# some userId validation
self.userId = userId这样就省去了一些userId的麻烦。
UPD:
如果将所有选项设置为True,这将调用getUserInfo,因此,query将调用3次:
if ( show_display_name ) : print fetcher.getUserDisplayName( userId )
if ( show_view_count) : print fetcher.getUserViewCount( userId )
if ( show_reputation ) : print fetcher.getUserReputation( userId )由于您至少以任何方式调用它一次,所以最好在__init__()中调用它,或者只需将检索到的值存储在实例属性中,然后按如下方式使用:
def __init__(self, userId):
#...
self.userInfo = None
def getUserReputation(self):
if self.userInfo is None:
self.userInfo = self.getUserInfo()
return self.userInfo['users'][0]['reputation']https://codereview.stackexchange.com/questions/7930
复制相似问题