Pergunta

Meu plano é C e C ++. I como Python muito, mas há um aspecto dele (e outras linguagens interpretadas eu acho) que é realmente difícil de trabalhar com quando você está acostumado a linguagens compiladas.

Quando eu escrevi algo em Python e chegar ao ponto onde eu possa executá-lo, ainda não há garantia de que há erros específicos do idioma permanecem. Para mim, isso significa que eu não posso confiar apenas em minha defesa runtime (testes rigorosos de entrada, afirma etc.) para evitar acidentes, porque em 6 meses quando algum código de outra forma agradável finalmente é executado, ele pode rachar devido a algum erro de digitação estúpido .

É claro que um sistema deve ser testado o suficiente para se certificar de todo o código foi executado, mas na maioria das vezes eu uso Python para scripts em casa e pequenas ferramentas, que nunca Claro recebe a atenção QA eles precisam. Além disso, algum código é tão simples que (se o fundo é C / C ++) você sabe que vai funcionar muito bem contanto que ele compila (por exemplo getter-métodos dentro de classes, normalmente um simples retorno de uma variável de membro).

Então, minha pergunta é o óbvio -? Existe alguma maneira (com uma ferramenta especial ou algo assim) eu posso ter certeza de todo o código no meu Python roteiro vai "compilação" e correr

Foi útil?

Solução

PyChecker e pylint .

Aqui está um exemplo de saída do pylint, resultante do programa trivial:

print a

Como você pode ver, ele detecta a variável indefinida, que py_compile não (deliberadamente).

in foo.py:

************* Module foo
C:  1: Black listed name "foo"
C:  1: Missing docstring
E:  1: Undefined variable 'a'


...

|error      |1      |1        |=          |

Trivial exemplo de por que os testes não são bons o suficiente, mesmo que cobrir "todas as linhas":

bar = "Foo"
foo = "Bar"
def baz(X):
    return bar if X else fo0

print baz(input("True or False: "))

EDIT: PyChecker lida com o ternário para mim:

Processing ternary...
True or False: True
Foo

Warnings...

ternary.py:6: No global (fo0) found
ternary.py:8: Using input() is a security problem, consider using raw_input()

Outras dicas

Outros mencionaram ferramentas como pylint que são muito bons, mas a longo e curto do que é que ele simplesmente não é possível fazer 100%. Na verdade, você pode até não querer fazê-lo. Parte do benefício a dinamicidade do Python é que você pode fazer coisas malucas, como nomes de inserir no âmbito local através de um acesso dicionário.

O que lhe vem para baixo é que se você quer uma maneira de erros de tipo captura em tempo de compilação, você não deve usar Python. A opção de idioma sempre envolve um conjunto de trade-offs. Se você escolher Python sobre C, apenas estar ciente de que você está trocando um sistema tipo forte para o desenvolvimento mais rápido, melhor manipulação de corda, etc.

Eu acho que o que você está procurando é a cobertura de linha de teste de código. Você deseja adicionar testes para seu script que irá certificar-se de todas as suas linhas de código, ou como muitos como você tem tempo para, fazer o teste. O teste é uma grande quantidade de trabalho, mas se você quer que o tipo de garantia de que você está pedindo, não há almoço grátis, sorry :(.

Se você estiver usando Eclipse com Pydev como um IDE, pode flag muitos erros para você com vermelho squigglies imediatamente e tem integração pylint também. Por exemplo:

foo = 5
print food

será marcada como "Undefined variable: alimentos". É claro que isso nem sempre é precisa (talvez comida foi definido anteriormente usando setattr ou outras técnicas exóticas), mas funciona bem na maioria das vezes.

Em geral, você só pode estaticamente analisar seu código na medida em que o seu código é realmente estático; o mais dinâmico o seu código é, mais você realmente fazer testes automatizados necessidade.

O seu código realmente é compilado quando você executá-lo, o tempo de execução Python vai reclamar se houver um erro de sintaxe no código. Em comparação com linguagens estaticamente compiladas como C / C ++ ou Java, ele não verifica se os nomes e tipos de variáveis ??estão corretas -. Para isso você precisa para realmente executar o código (por exemplo, com testes automatizados)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top