你最unpythonic的代码片段

时间:2009-01-17 20:27:50

标签: python

我是一名经验丰富的python开发人员,并且仍然在编写正确但非语言代码。我认为看到人们编写的python代码的小例子在某种程度上与普遍优先的做事方式发生冲突可能具有启发性和娱乐性。

我对您实际编写的代码感兴趣而不是发明示例。这是我的一个:在代码中期望一个可能为空的序列或者我没有

if data is not None and len(data) > 0:

我后来将其缩减为

if data:

更简单的版本允许额外的真值,如True或10,但这没关系,因为调用者犯了一个错误,并将从if中的语句中获得异常。

6 个答案:

答案 0 :(得分:7)

我发现手动类型检查最“unpythonic”(虽然通常也很糟糕)。有两种常见的情况被滥用。第一种是当函数的逻辑根据参数的类型而不同时。例如:

def doStuff (myVar):
    if isinstance (myVar, str):
        # do stuff
        pass
    elif isinstance (myVar, int):
        # do other stuff
        pass

第二种情况是程序员尝试创建一个强类型函数,就像你希望用静态类型语言一样。

def doStuff (myVar):
    if not isinstance (myVar, int):
        raise TypeError ('myVar must be of type int')

答案 1 :(得分:5)

一些可以从类C语言继承的非语言习惯:

1)不必要的分号:

printf "Hello world";

2)不必要的索引:

# Bad
for i in range(len(myList)):
    print myList[i]

# Good
for item in myList:
    print item

答案 2 :(得分:4)

我的坏习惯是:

index = 0
for item in someCollection:
    doSomething(index, item)
    index += 1

而不是:

for index, item in enumerate(someCollection):  
    doSomething(index, item)

哪个更干净: - )

另外 - 谨防简单

if someList:

如果someList将成为正整数或非空字符串或其他任何内容,则会受到影响。

可能很难找到错误
if len(someList):  

会立即发现此类错误。

答案 3 :(得分:2)

我写的最无语的代码是错误地重新发明已经存在于库中或已经过大修的东西(例如DSU成语) - 注意到这一点,将其全部撕掉,并用(通常是)替换它单线感觉很好。

答案 4 :(得分:1)

我已经做了很多年的python,我更喜欢更详细的第一个例子到更“pythonic”的例子。

也许这不是派对路线,但它在意图上更加清晰,并且对其他可能知道或不知道python的所有小秘密的开发人员更有意义。

因人而异

答案 5 :(得分:0)

import random
make_token = (lambda chars, length:"".join([chars[random.randint(0,len(chars)-1)] for c in range(0, length)]))
random_token = make_token("abcdefghijklmnopqrstuvwxyz0123456789", 20)

这制作了一个长度为20的随机标记,由放入的字符集组成。我从那时起就学会了错误。 ;)