首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆栈溢出用户信息获取器

堆栈溢出用户信息获取器
EN

Code Review用户
提问于 2012-01-18 15:43:16
回答 3查看 1.8K关注 0票数 10

我开始研究Python及其设施。我只是试着用一些基础库制作一个简单的程序。

我想听听你注意到的任何事情-风格、可读性、安全性等。

代码语言:javascript
复制
#!/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

EN

回答 3

Code Review用户

回答已采纳

发布于 2012-01-19 16:04:00

代码语言:javascript
复制
#!/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。

代码语言:javascript
复制
        response = urllib2.urlopen( 'http://api.stackoverflow.com/1.1/users/' + str(userId) )

我会考虑将API转换为全局常量。

代码语言:javascript
复制
        response = response.read()
        jsonData = zlib.decompress( response, 16+zlib.MAX_WBITS )

我会把前两行合并起来

代码语言:javascript
复制
        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来代替“用户”本身呢?

代码语言:javascript
复制
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

代码语言:javascript
复制
    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 )

首先,如果不需要父母。其次,编写代码的方式每次调用都会返回到服务器。因此,您将对堆栈溢出服务器进行三次调用,您可以使用其中一次调用。

票数 7
EN

Code Review用户

发布于 2012-01-18 16:21:13

我认为您的命名方案是好的,乍一看,可以很容易地看出代码所做的事情,而不必对其进行过多的研究。

但是,如果我想说些什么,我会说:

  • 删除不必要的空格,例如。如果(条件),或self.getUserInfo( userId )。这当然是一个品味的问题,但我发现它更符合常规的编码风格,而不是“膨胀”的空白。
  • 在2.7:http://docs.python.org/library/optparse.html中不推荐使用2.7解析器
  • 在parser.add.option()中,您可以从大名中删除单词"show“,而是执行以下操作,从而消除了对show_display_name的所有声明的需求,并且仍然保持了代码的易读性。..。parser.add.option(parser.add_option("-r“、”-声誉“、action="store_true”、dest=“信誉”、default=False、help=“显示用户的声誉”) (show,args) = parser.parse_args() fetch =StackOverflowFetcher(show.reputation):print fetch.getUserReputation(show.userId)
  • 我不太明白下面一行将所有内容设置为true的要点,因为如果设置了解析的选项,则使用store_true作为操作,这似乎有点奇怪。if ((非show_display_name)和(非show_view_count)和(非show_reputation) ):show_display_name = show_view_count = show_reputation = True
票数 7
EN

Code Review用户

发布于 2012-01-19 12:09:43

http://api.stackoverflow.com/1.1/users/string_id返回

代码语言:javascript
复制
{
  "error": {
    "code": 404,
    "message": "The server has not found anything matching the Request-URI."
  }
}

并将KeyErrors带到这里:

代码语言:javascript
复制
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返回

代码语言:javascript
复制
{
  "total": 0,
  "page": 1,
  "pagesize": 30,
  "users": []
}

并将IndexErrors带到这里:

代码语言:javascript
复制
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__方法可能是个好主意:

代码语言:javascript
复制
__init__(self, userId):
    # some userId validation
    self.userId = userId

这样就省去了一些userId的麻烦。

UPD:

如果将所有选项设置为True,这将调用getUserInfo,因此,query将调用3次:

代码语言:javascript
复制
if ( show_display_name ) : print fetcher.getUserDisplayName( userId )
if ( show_view_count) : print fetcher.getUserViewCount( userId )
if ( show_reputation ) : print fetcher.getUserReputation( userId )

由于您至少以任何方式调用它一次,所以最好在__init__()中调用它,或者只需将检索到的值存储在实例属性中,然后按如下方式使用:

代码语言:javascript
复制
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']
票数 7
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/7930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档