当前位置:  开发笔记 > 编程语言 > 正文

我的第一个python程序:你能告诉我我做错了什么吗?

如何解决《我的第一个python程序:你能告诉我我做错了什么吗?》经验,为你挑选了3个好方法。

我希望这个问题适合stackoverflow.如果没有,我会马上删除这个问题.

我刚刚编写了我的第一个python程序.我们的想法是你可以发出一个命令,并将它并行发送到几个服务器.

这仅用于个人教育目的.该计划有效!我真的想在python上变得更好,因此我想问下列问题:

    与PHP(我以前习惯)相比,我的风格看起来很混乱.您对样式改进有什么建议吗?

    我使用正确的库吗?我正确使用它们吗?

    我使用正确的数据类型吗?我正确使用它们吗?

我有一个很好的编程背景,但是我花了很长时间才开发出适合PHP的样式(PEAR编码标准,知道使用什么工具以及何时使用).

来源(一个文件,92行代码)

http://code.google.com/p/floep/source/browse/trunk/floep



1> Ismael..:

通常最好在句子结尾之后的内容:是在一个单独的行中(也不要在它之前添加空格)

if options.verbose:
  print ""

代替

if options.verbose : print ""

如果要迭代它,则无需检查列表的len

if len(threadlist) > 0 : 
  for server in threadlist :
    ...

是多余的,更"可读"(python足够聪明,不能遍历空列表):

for server in threadlist:
  ...

另外一个更"'pythonistic'是使用列表的理解(但肯定是一个有争议的意见)

server = []
for i in grouplist : servers+=getServers(i)

可以缩短为

server = [getServers(i) for i in grouplist]


re:"有争议的意见"......在这种情况下,我认为列表理解是完全合适的.一旦理解了列表推导,就没有理由不在这样的代码中使用它.

2> 小智..:

在卸载任何批评之前,首先让我祝贺你的第一个Python程序正常运行.从一种语言转移到另一种语言可能是一件苦差事,不断摸索语法问题并通过不熟悉的库进行搜索.

引用最多的风格指南是PEP-8,但这只是一个指南,至少有一部分被忽略......不,我的意思是认为不适用于某些特定情况,并对指南作者和贡献者给予应有的尊重: - ).

我无法将它与PHP进行比较,但与其他Python应用程序相比,很明显您遵循其他语言的样式约定.我并不总是同意其他开发人员说你必须做的很多事情,但随着时间的推移,我认识到为什么使用约定有助于传达应用程序正在做的事情,并将帮助其他开发人员帮助你.


提高异常,而不是字符串.

raise 'Server or group ' + sectionname + ' not found in ' + configfile

raise RuntimeError('Server or group ' + sectionname + ' not found in ' + configfile)


在'if'或'for'结尾处的':'之前没有空格,并且不要在同一行上放置多个语句,并且要在运算符周围放置空格.为对象使用变量名称并使用ijfor循环索引变量(比如我们熟练的FORTRAN前辈):

for i in grouplist : servers+=getServers(i)

变为:

for section in grouplist:
    servers += getServers(section)


容器可以在不获取长度的情况下测试内容:

while len(threadlist) > 0 :

while threadlist:

if command.strip() == "" :

if command.strip():


拆分元组通常不会放在语句左侧的括号中,命令逻辑有点复杂.如果没有args那么".join(...)将是一个空字符串:

(options,args) = parser.parse_args()

if options.verbose : print "floep 0.1" 

command = " ".join(args)

if command.strip() == "" : parser.error('no command given')

options, args = parser.parse_args()
if options.verbose:
    print "floep 0.1" 

if not args:
    parser.error('no command given')
command = " ".join(args)


一个python for循环有一个不寻常的'else'子句,如果循环遍历所有元素而没有'break',则执行该子句:

    for server in threadlist :
        foundOne = False 
        if not server.isAlive() :
            ...snip...
            foundOne = True

        if not foundOne :
            time.sleep(0.010)

    for server in threadlist:
        if not server.isAlive():
            ...snip...
            break
    else:
        time.sleep(0.010)


获取行列表然后将它们重新组合在一起有点长篇大论:

        result = proc.readlines()
        strresult = ''
        for line in result : strresult+=line 
        self.result = strresult

        self.result = proc.read()


您的库使用很好,查看子进程模块,它更新一点.

你的数据类型没问题.

你会得到很多其他的东西:-)



3> chradcliffe..:

在Python中不推荐使用字符串异常,因此这一行:

if not config.has_section(sectionname): 
    raise 'Server or group ' + sectionname + ' not found in ' + configfile

应该重做这样的事情:

if not config.has_section(sectionname):
    raise ConfigNotFoundError(
        "Server or group" + sectionname + "not found in" + configfile)

class ConfigNotFoundError(Exception):
    pass

[编辑在评论中反映了dangph的建议]

这是更多的代码行,但它对未来的升级更好.

为了便于阅读,可以这样:

parser.add_option('-q','--quiet',action="store_false", help="Display only server output", dest="verbose", default=True)

可以像这样重写:

parser.add_option('-q',
                  '--quiet',
                  action="store_false",
                  help="Display only server output", 
                  dest="verbose", 
                  default=True)

您可能更喜欢另一种分割方法调用的方法,但其想法是长行很难读取.

您还应该阅读PEP 8以了解Python风格.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有