2010-02-19 172 views
1

我有另一个新手Python问题。我有以下的代码,我有一种感觉是不是写成Python的,因为它应该是:python basic while循环

rowindex = 0 
    while params.getfirst('myfield'+rowindex): 
     myid = params.getfirst('myfield'+rowindex) 
     # do stuff with myid 
     rowindex+=1 

输入到这个脚本是可以有任意数目的命名输入字段的HTML页面“MyField的# “其中#从0开始并依次增加。在Perl中,我会做更像这样的事情:

rowindex = 0 
    while myid = params.getfirst('myfield'+rowindex): 
     #do stuff with myid 
     rowindex+=1 

但是这在Python中是无效的语法。我知道我会有什么工作,但有没有更好的方法?谢谢。

回答

5

一个简单的计数器的“无界”性质有一定的吸引力。然而,这也是某个人通过欺骗数十亿字段的表单来尝试拒绝服务攻击的机会。当你试图处理这些数十亿的字段时,简单地通过字段计数可能会使你的Web服务器停滞不前。

由于Python自动转换为long,通常的20亿整数溢出不适用。有人可以用10亿的字段来惩罚你的网站。

for i in range(1024): # some sensible upper limit, beyond which the input is suspicious 
    myid= params.getfirst("myfield%d" % i) 
    if not myid: break 
     # do stuff with myid 
+0

非常好的想法! – Wes 2010-02-19 14:21:27

+1

欺骗十亿个字段需要在请求中提供千兆字节的信息。如果服务器接受,那是一个DOS自己的,不需要任何Python代码。 – recursive 2010-02-19 16:45:04

+0

@recursive。 Django懒惰地评估POST请求,但如果你不断询问值,它会继续接受来自客户端的输入。我想你可以检查内容长度的头,以防止这样的事情,但所有的浏览器(和所有客户端)提供呢? – 2010-02-19 18:13:27

1

你可以这样做。我认为这更“灵活”,因为我可以在while循环内提供我想要的任何条件,就像我想要的那样。但是再一次,有些人会说它的个人品味。

rowindex = 0 
while 1: 
    myid = params.getfirst('myfield'+rowindex) 
    if not myid: #or check for length of 0 , etc, then break 
     break 
    rowindex+=1 
+0

我个人的口味说'而TRUE',ESE ;-) – gruszczy 2010-02-19 14:14:35

+0

肯定。我只保存3个字符,这就是全部:) – ghostdog74 2010-02-19 14:32:41

2

,我想我会做一个小发电机完全封装的循环逻辑:

import itertools 

def genit(params): 
    for rowindex in itertools.count(): 
    theid = params.getfirst('myfield%s' % rowindex) 
    if not theid: break 
    yield theid 

,使应用程序(“业务”)逻辑可以更清晰地看到在主流:

for myid in genit(params): 
    dosomething_with(myid) 

特别是如果dosomething_with是内联。生成器实际上是“猫的睡衣”,用于将丰富/复杂的循环逻辑与应用程序/业务逻辑完全分离。

如果因为某些特殊的原因,我渴望让他们在这种特殊情况下合并,我还是会避免低抽象赞成for rowindex in itertools.count():我认为这是更清晰,更锐利以及更rowindex = 0/while/rowindex += 1代码简洁。这整个成帧也可以更容易地限制环路之间,切换作为公认的答案,如果当你决定要做到这一点,并具有无限的循环,如在原来的问题 - 只是改变itertools.count() /从xrange(N)

-1

尝试做这个

While 1: 

    codehere