Post de autoria de Mohammad Tayseer publicado originalmente em inglês. Tradução livre de Eduardo Cuducos.
Goste ou não, você já usa diferentes linguagens de programação a cada dia: SQL, JavaScript, Python, C++ e outras. Diz o ditado que ao aprender uma nova linguagem de programação, você aprende a programar melhor, mas muitas pessoas não ganham esse benefício e sentem que isso é uma perda de tempo. Depois de conversar e trabalhar como pessoas assim por muitos anos, eu percebi que elas aprendem a sintaxe da linguagem de programação, talvez algumas bibliotecas, mas elas não pegam o espírito da linguagem.
Por exemplo:
# Ruim: você precisa ler até o final para entender a intenção do código
img.find('.jpg') != -1
img.find('.jpg') >= 0
# Mais legível
'.jpg' in img
'.jpg' not in img
# Ruim: número mágico
img[-4:] == '.jpg'
# Bom: funciona com textos de qualquer tamanho
img.endswith('.jpg')
# Ruim
(img.endswith('.jpg') or img.endswith('.jpeg') or img.endswith('.png') or
img.endswith('.gif')
# Bom: usa capacidades nativas do Python para fazer o código mais compacto
img.endswith((".jpg", ".jpeg", ".png", ".gif"))
# Ruim
path == 'js' or path == 'css' or path == 'img' or path == 'font' or path == 'fonts'
# Bom: código mais compacto
path in ('js', 'css', 'img', 'font', 'fonts')
# Ruim
(os.path.exists(os.path.join(path, "space")) or
os.path.exists(os.path.join(path, "bucket")) or
os.path.exists(os.path.join(path, "actor"))
# Bom: código compatco, mais legível, e a lista pode ser movida para um outro arquivo
any(os.path.exists(os.path.join(path, item)) for item in ["space", "bucket", "actor"])
# Ruim
for i in range(len(lst)):
elt = lst[i]
print i, elt
# Bom: usa funções nativas do Python
for i, elt in enumerate(lst):
print i, elt
# Ruim
print 'Hello ', name, '. You are ', age, ' years old'
# Bom: reflete a estrutura que a saída espera
print 'Hello {name}. You are {age} years old'.format(name=name, age=age)
# Ruim
if not (key in dict):
print 'Key missing'
# Bom: mais legível
if key not in dict:
print 'Key missing'
# Ruim
s = names[0]
for name in names[1:]:
s += ', ' + name
# Bom: evita erros por um passo
s = ', '.join(names)
# Ruim: descobrir se o array1 é um subconjunto do array2
is_subset = True
for x in array1:
found = False
for y in array2:
if x == y:
found = True
break
if not found:
is_subset = False
break
# Bom: 2 linhas ao invés de 10
def subset_of(array1, array2):
return set(array1).issubset(array2)
# Ruim
if case_sensitivity.lower() == 'sensitive':
matcher = fnmatch.fnmatchcase
elif case_sensitivity.lower() == 'insensitive':
def matcher(fname, pattern):
return fnmatch.fnmatchcase(fname.lower(), pattern.lower())
else:
matcher = fnmatch.fnmatch
# Bom: a busca pro padrão pode ser movida para outro arquivo
matchers = {
'sensitive': fnmatch.fnmatchcase
'insensitive': lambda fname, pattern: fnmatch.fnmatchcase(fname.lower(), pattern.lower())
}.get(case_sensitivity.lower(), fnmatch.fnmatch)