Por que o pylint se opõe a nomes de variáveis ​​de caractere único?

96

Ainda estou me acostumando com as convenções do python e usando pylintpara tornar meu código mais python , mas estou confuso pelo fato de que o pylint não gosta de nomes de variáveis ​​com um único caractere. Eu tenho alguns loops como este:

for x in x_values:
   my_list.append(x)

e quando eu corro pylint, estou obtendo Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}- isso sugere que um nome de variável válido deve ter entre 3 e 31 caracteres, mas eu olhei através das convenções de nomenclatura PEP8 e não vejo nada explícito sobre letras minúsculas simples , e vejo muitos exemplos que os usam.

Há algo que estou perdendo no PEP8 ou este é um padrão exclusivo do pylint?

Amanda
fonte

Respostas:

47

O PyLint verifica não apenas as recomendações PEP8. Ele também tem suas próprias recomendações, uma das quais é que o nome de uma variável deve ser descritivo e não muito curto.

Você pode usar isso para evitar nomes curtos:

my_list.extend(x_values)

Ou ajuste a configuração do PyLint para informar ao PyLint quais nomes de variáveis ​​são bons.

Warvariuc
fonte
10
Usar _para manter valores temporários é antipadrão. Variáveis ​​de sublinhado indicam valores irrelevantes / descartados, não atribuição temporária, como iou x. Além disso, no intérprete tem um significado especial para conter o último valor da última expressão.
James,
121

Um pouco mais de detalhes sobre o que maca alex notou: você pode dizer ao PyLint para fazer exceções para nomes de variáveis que (você jura o dedo mínimo) são perfeitamente claros, embora tenham menos de três caracteres. Encontre ou adicione ao seu arquivo pylintrc , sob o [FORMAT]cabeçalho:

# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_,pk,x,y

Aqui pk (para chave primária), xey são nomes de variáveis ​​que adicionei.

mlncn
fonte
7
Esta é a melhor resposta.
giorgiosironi
1
Não parece funcionar pylint 1.8.3. pylint.pycqa.org/en/1.8/user_guide/options.html
James,
2
O que eu realmente gostaria é que o pylint aceite (a pedido) vars curtos quando eles são usados ​​em compreensões. Compare return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()] vs return [a for a in thing.get_customer_addresses() if a.is_proper()] I afirmam que o último é mais claro, pois a é óbvio a partir do contexto. Em geral, o comprimento da variável deve se correlacionar com o escopo da variável.
EdvardM
21

Em linguagens fortemente tipadas, as variáveis ​​de nome de 1 letra podem ser ok-ish, porque geralmente você obtém o tipo próximo ao nome na declaração da variável ou no protótipo de função / método:

bool check_modality(string a, Mode b, OptionList c) {
    ModalityChecker v = build_checker(a, b);
    return v.check_option(c);
}

Em Python, você não obtém essas informações, portanto, se escrever:

def check_modality(a, b, c):
    v = build_checker(a, b)
    return v.check_option(c)

você não está deixando absolutamente nenhuma pista para a equipe de manutenção sobre o que a função poderia estar fazendo, como é chamada e o que retorna. Portanto, em Python, você tende a usar nomes descritivos:

def check_modality(name, mode, option_list):
    checker = build_checker(name, mode)
    return checker.check_option(option_list)

e você até adiciona uma docstring explicando o que as coisas fazem e quais tipos são esperados.

maca alex
fonte
7
Em vez de "linguagens compiladas", eu escreveria "explicitamente digitadas". Haskell, por exemplo, também é compilado, mas você pode escrever declarações implícitas como em Python.
Sebastian Mach
14
Embora eu concorde com você nesses casos, forçar 3 ou mais caracteres em um nome de variável não significa que será descritivo. Atualmente estou usando, with open(FILE) as f: items = f.readlines()por exemplo, onde a variável fé realmente óbvia, mas recebo avisos de pylint. Isso me fez mudar para flake8.
Axel Örn Sigurðsson de
3
você também pode alterar as regras do pylint para permitir 'f' um nome de variável. Já existem exceções para i, j AFAIR.
maca alex de
10
para as pessoas que votaram contra esta resposta: Sou o cara que introduziu a regra no Pylint e a razão é exatamente a que foi fornecida. Você pode não concordar com esta decisão, mas esta é a resposta para a pergunta ...
maca alex
1
Eu sigo totalmente o seu raciocínio, embora frequentemente em algoritmos e programação matemática alguns valores sejam normalmente nomeados com uma letra. Acho que uma função chamada fé totalmente diferente de uma OptionListchamada c. Especialmente quando não consigo renomeá-lo para functionporque ele sombreia um embutido.
kap
19

Hoje em dia também existe a opção de substituir o regexp. Ou seja, se você quiser permitir caracteres únicos como variáveis:

pylint --variable-rgx="[a-z0-9_]{1,30}$" <filename>

Portanto, pylintcorresponderá ao PEP8 e não trará violações adicionais no topo. Além disso, você pode adicioná-lo .pylintrc.

Jimilian
fonte
3
Para a versão, > 1.8.3esta parece ser a resposta. Pode colocar isso no seu .pylintrc, bem como para configuração permanente: variable-rgx=[a-z0-9_]{1,30}$.
James,
7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $" pode ser um pouco mais apropriado, "9" não deve ser um nome de variável válido.
Eric Le Fort
16

A razão mais profunda é que você pode se lembrar o que você pretendia a, b, c, x, y, e zpara dizer quando escreveu seu código, mas quando os outros lê-lo, ou mesmo quando você voltar para o seu código, o código torna-se muito mais legível quando você dá é um nome semântico. Não estamos escrevendo coisas uma vez no quadro-negro e depois apagando. Estamos escrevendo um código que pode durar uma década ou mais e ser lido muitas e muitas vezes.

Use nomes semânticos. Nomes semânticas que usei ter sido como ratio, denominator, obj_generator, path, etc. Pode demorar um segundo extra ou dois para digitá-los para fora, mas o tempo que você salvar tentando descobrir o que você escreveu até meia hora a partir de então vale a pena .

Aaron Hall
fonte
7
Obrigado. Aqui está o código final - gist.github.com/amandabee/8969833 - vejo seu ponto sobre o código que eu (ou você) podemos ler em um ano, mas, neste caso, acho que xey são genuinamente descritivos.
Amanda