Você já pensou que um dia você entrou na programação da web PHP muito rapidamente?
Já se passaram vários anos, você ganhou muita experiência e não consegue pensar em outras maneiras de trabalhar com a web, exceto o PHP. Talvez você às vezes duvide da escolha que fez, mas não consegue confirmar suas dúvidas aqui e agora. Ao mesmo tempo, você precisa de exemplos reais; você quer entender as mudanças que podem ocorrer em aspectos particulares do seu trabalho.
Hoje vou tentar responder à seguinte pergunta: "
E se usarmos Python em vez de PHP? ".
Eu já fiz essa pergunta muitas vezes. Uso o PHP há 11 anos e sou um especialista certificado em PHP. Eu o dominei, para que funcione da maneira que eu quero. Fiquei realmente intrigado com vários artigos que criticaram o PHP severamente (
PHP: um fractal de mau design ). No entanto, quando o acaso chegou, mudei para Ruby e depois para Python. Eventualmente, eu escolhi o último. Agora vou tentar explicar como nós, pessoal de Python, vivemos por aí.

Formato do artigo
A melhor maneira de aprender um novo idioma é compará-lo com um idioma que você já pode aplicar, a menos que o novo idioma seja drasticamente diferente do atual. Um artigo no portal da Web Ruby (
Ruby de outros idiomas ) fornece essa comparação, porém falta exemplos.
Devo também observar que este artigo compara apenas aspectos que chamam sua atenção durante as primeiras semanas após a mudança para o novo idioma.
Preparando consoles
Eu fiz o meu melhor para tornar este artigo interativo. Portanto, recomendo executar todos os exemplos nos consoles ao ler o artigo. Você precisará de um console PHP ou poderá usar o console
PsySH , que é ainda melhor:
php -a
E um console Python. Eu recomendo o uso de
bpython ou
ipython , pois eles já apresentam comparação de conclusão de código com o console padrão integrado ao idioma. No entanto, a seguinte opção também é aplicável:
python
E então:
import rlcompleter import readline readline.parse_and_bind("tab: complete")
Evitando a repetição dessas açõesCrie o arquivo ~ / .pyrc com:
import rlcompleter import readline readline.parse_and_bind("tab: complete")
Adicione algumas linhas no arquivo ~ / .bashrc:
export PYTHONSTARTUP="${HOME}/.pyrc" export PYTHONIOENCODING="UTF-8"
Adn para fazer alterações imediatamente sem fazer login novamente:
source ~/.bashrc
Sobre idiomas
- Python é uma linguagem que apresenta uma forte digitação dinâmica de pato ( consulte Informações sobre digitação ). Python não é limitado em termos de sua aplicação. É usado para desenvolvimento web, daemons, cálculos científicos ou como uma linguagem de extensões. Idiomas semelhantes em termos de digitação: Ruby.
- PHP é uma linguagem que apresenta uma digitação dinâmica fraca. O PHP também é uma linguagem de uso comum, no entanto, sua área de aplicação abrange principalmente web e daemons. Outros recursos não são trabalhados adequadamente, tornando-o não aplicável na produção. Algumas pessoas acreditam que o PHP é destinado a morrer . Idiomas semelhantes em termos de digitação: JavaScript, Lua, Perl.
Especificidades gerais
- O código é escrito em arquivos .py, independentemente da versão do Python. Não são necessárias tags de abertura como o PHP, pois o Python foi originalmente desenvolvido como uma linguagem de programação de uso geral.
- Além disso, não há php.ini pelo mesmo motivo. Existem duas dúzias
variáveis de ambiente , no entanto, na maioria dos casos, são indefinidas (além de PITONIOENCODIFICAÇÃO). Em outras palavras, não há conexões padrão com bases, gerenciamento de filtro de erros, gerenciamento de limites, extensões etc., o que é natural para a maioria dos idiomas de uso geral. Como resultado, os programas se comportam de maneira semelhante na maioria dos casos (o comportamento deles não depende das configurações favoritas do líder da sua equipe). Configurações como php.ini são armazenadas no arquivo de configuração principal de um aplicativo na maioria dos casos. - Um ponto-e-vírgula não é necessário no final de uma sequência. No entanto, se colocarmos um ponto e vírgula lá, ele funcionará como no PHP. No entanto, é desnecessário e indesejado, para que você possa simplesmente esquecê-lo.
- Variáveis não começam com $ (que o PHP herdou do Perl que, por sua vez, o adotou
do Bash). - A atribuição em ciclos e condições não se aplica, de modo que ninguém erro na comparação da atribuição, o que é um erro comum (como o autor do idioma acredita). Veja PEP 572 para python 3.8, se necessário.
- Ao analisar os arquivos, o Python coloca automaticamente a cópia do arquivo com a extensão .pyc (desde que a sua versão do Python seja menor que 3.3 e você não tenha instalado o PYTHONDONTWRITEBYTECODE ) na mesma pasta em que o código do byte está localizado. Em seguida, ele sempre executa esse mesmo arquivo, a menos que você altere a fonte.
Esses arquivos são automaticamente ignorados em todos os IDEs e geralmente não interferem. Esse recurso pode ser percebido como um análogo completo do PHP APC, considerando que os arquivos .pyc provavelmente estarão localizados na memória cache do arquivo. - Em vez de NULL, TRUE, false, devemos usar None, True, false (particularmente neste caso).
Aninhamento e recuo
Aqui está algo incomum: o aninhamento de código é determinado com recuos em vez de colchetes.
Então, em vez de:
foreach($a as $value) { $formatted = $value.'%'; echo $formatted; }
Devemos escrever o seguinte:
for value in a: formatted = value + '%' print(formatted)
Espere, espere! Não feche o artigo. Aqui você pode cometer o mesmo erro que cometi.
Uma vez acreditei que a ideia de usar recuos para aninhamento de código é ridícula. Toda a minha natureza estava protestando contra isso, pois todos os desenvolvedores escrevem seu código à sua maneira, independentemente dos diferentes Guias de Estilo.
Aqui está o mistério do mundo: não há problema de travessão. Na maioria dos casos (99% dos casos), os recuos são colocados automaticamente pelo IDE como em qualquer outro idioma. Você simplesmente não pensa sobre isso. Não enfrentei nenhum problema relacionado a travessões ao longo de 2 anos de uso do idioma.
Digitação forte
A próxima coisa que você deve prestar atenção é digitação forte. No entanto, alguns códigos primeiro:
print '0.60' * 5; print '5' == 5; $a = array('5'=>true); print $a[5]; $value = 75; print $value.'%'; $a='0'; if($a) print 'non zero length';
Todos os exemplos acima são possíveis graças à digitação dinâmica.
Sim, eu sei que a declaração de tipo está disponível para PHP. Mas não está ativado por padrão e não funciona em qualquer lugar.
No entanto, o seguinte não funcionará em Python:
>>> print "25" + 5 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects
Exceto ...Exceto pelos valores booleanos, mas
é por design .
Normalmente, os tipos de dados não serão misturados no seu código e esse efeito não o distrairá. Em geral, quando eu codifiquei em PHP, havia apenas algumas situações por projeto em que a digitação dinâmica realmente ajudou. Nos demais casos, variáveis do mesmo tipo interagiram entre si.
A digitação forte afeta a manipulação de erros. Por exemplo, se uma função
int retornar um número inteiro, ela não poderá retornar
None a uma sequência, da qual esse tipo não poderá ser explicitamente extraído. Nesse caso, uma exceção será gerada. Pode ser necessário converter todos os dados do usuário para o tipo de dados necessário, caso contrário, uma exceção será gerada na versão Production um dia.
try: custom_price = int(request.GET.get('custom_price', 0)) except ValueError: custom_price = 0
Afeta não apenas as funções padrão, mas também alguns métodos das listas, seqüências de caracteres e algumas funções de bibliotecas adicionais. Geralmente, um desenvolvedor Python mantém em mente todas as exceções que podem ser levantadas e as considera. Se o desenvolvedor não se lembrar deles, eles verificam o código da biblioteca. Obviamente, às vezes nem todos os casos são considerados, e os usuários podem causar exceções na versão Produção. Como esse é um fenômeno raro, e geralmente as estruturas da Web os enviam automaticamente para o correio do administrador, esses casos são rapidamente corrigidos.
Para usar valores de vários tipos de dados em uma única expressão, eles devem ser convertidos. Existem funções para isso:
str ,
int ,
bool ,
long . Além disso, existem decisões mais convenientes para formatação.
Cordas
Formatação
Em PHP:
$this_way = 'this_way'; echo "Currently you do it $this_way or {$this way}."; echo "Or ".$this_way."."; echo sprintf("However the following is possible: , %s or %1$'.9s.", $this_way);
Agora você deve aprender a fazê-lo de uma maneira diferente:
etot = 'this' var = 'option' print('To %s option' % etot) print(etot + ' option can also be used, but not recommended) print('Or to %s %s' % (etot, var)) print('Or to %(etot)s %(var)s' % {'etot': etot, 'var': var}) # Very useful for localization team print('Or to {} {}'.format(etot, var)) print('Or to {1} {0}'.format(var, etot)) print('Or to {etot} {var}'.format(var=var, etot=etot)) # And finally print(f'Or to {etot} {var}') # Starting from Python 3.6
Existem mais opções e uma opção conveniente para localizações.
Métodos de String
Python tem algo que está faltando no PHP: métodos internos. Vamos comparar:
strpos($a, 'tr'); trim($a);
vs a.index('tr') a.strip()
E com que frequência você faz algo assim?
substr($a, strpos($a, 'name: '));
vs a[a.index('name: '):]
Suporte Unicode
Finalmente, Unicode. No Python 2, todas as strings NÃO são Unicode por padrão. (No Python 3, todas as strings são Unicode por padrão). No entanto, quando você adiciona o caractere
u no início de uma string, ele automaticamente se torna Unicode. E então todos os métodos de string internos (e não internos) do Python funcionarão corretamente.
>>> len(' ')

No PHP, o processamento Unicode natural estava sendo desenvolvido para o PHP 6, mas o PHP 6 foi cancelado ( Andrei Zmievski: o que aconteceu com o Unicode e o PHP 6 ).
No PHP, a propósito, você pode usar a função MBString sobrecarregando para receber um efeito semelhante, mas está obsoleto.
No entanto, você não poderá trabalhar com cadeias binárias usando funções sobrecarregadas, mas ainda poderá trabalhar com uma cadeia como uma matriz.
Sobre cadeias brutas (opcional)Strings Raw
Você deve saber a diferença entre cadeias de caracteres simples e duplas:
$a = 'Hello.\n'; $a[strlen($a)-1] != "\n";
O recurso semelhante no Python chamou cadeias de caracteres brutas. Para usá-lo, coloque
r antes de uma string entre aspas.
a = r'Hello.\n' a[-1] != '\n'
Matrizes
Agora é hora de matrizes. No PHP, você pode usar números inteiros ou seqüências de caracteres como chaves:
var_dump([0=>1, 'key'=>'value']);

No PHP, matrizes não são matrizes padrão ( listas ), mas matrizes associativas ( dicionário ). Matrizes padrão também estão disponíveis em PHP, são SPLFixedArray . Eles exigem menos memória, potencialmente trabalham mais rápido, mas devido à complexidade da criação e extensão, raramente são usados.
No Python, quatro tipos de dados são usados para uma matriz:
- lista
a = [1, 2, 3]
- dict - dicionário. Os dicionários não têm ordem de armazenamento de dados (como no PHP).
d = {'a': 1, 'b': 2, 'c': 3}
- tupla. Algo como uma matriz fixa de valores não homogêneos. Perfeitamente adequado para retornar vários valores de uma função e para armazenamento compacto de configurações.
t = (True, 'OK', 200, )
- conjunto. Basicamente, esta é uma lista de valores exclusivos que não têm ordem de armazenamento.
s = set([1,3,4]) s[0] = False
No PHP, matrizes são uma espécie de canivete suíço - elas podem servir a todos os propósitos. Quanto ao Python, você precisa usar matrizes de dados nativas da Ciência da Computação. Além disso, você precisa usar matrizes de dados apropriadas para cada caso. Você pode dizer que essas são dificuldades desnecessárias que os programadores nunca devem enfrentar. Bem, esse não é o ponto.
- Primeiro: a possibilidade de escolher entre tupla, conjunto, lista e ditado não dificulta as coisas - apenas se torna um hábito subconsciente, como mudar de marcha.
- Segundo: lista ou ditado são usados na maioria dos casos.
- Terceiro: na maioria dos casos, quando você precisa armazenar o par de valores-chave, a ordem não é essencial; no entanto, quando você precisa manter o pedido, na maioria dos casos, existem apenas valores em vez de pares de valores-chave.
- Quarto: Python tem um dicionário ordenado - OrderedDict .
Importações
Este é um recurso muito interessante. É um tipo de conceito alternativo de espaços de nome que deve ser usado.
No PHP, você escreve
require_once e ele permanece disponível até o final da sessão de execução do PHP. Geralmente, ao usar o CMS, os desenvolvedores colocam tudo em classes, os colocam em locais especiais, escrevem uma pequena função que conhece esses locais e registram essa função via
spl_autoload_register no início do arquivo.
No Python, no entanto, cada arquivo tem seu próprio espaço para nome. Como resultado, um arquivo conterá apenas objetos importados para lá. Por padrão, apenas a biblioteca Python padrão está disponível (aproximadamente 80 funções).
Veja o exemplo abaixo:
Vamos supor que você criou o arquivo
tools / logic.py :
def is_prime(number): max_number = int(sqrt(number)) for multiplier in range(2, max_number + 1): if multiplier > max_number: break if number % multiplier == 0: return False return True
Agora, você deseja usá-lo no arquivo
main.py. Nesse caso, você precisa importar o arquivo inteiro ou as entidades de arquivo necessárias no arquivo de destino em que está trabalhando.
from tools.logic import is_prime print(is_prime(79))
Esta regra se aplica a todo o Python. Na maioria dos casos, quando você começa a trabalhar em qualquer arquivo, primeiro precisa importar objetos auxiliares do Python para o seu arquivo: suas próprias bibliotecas e integradas. É como se funções PHP como mysqli_ *, pdo_ *, memcached_ *, assim como todo o seu código, estivessem armazenadas em espaços de nome e você tivesse que importá-las para cada arquivo com o qual trabalha. Que vantagens essa abordagem tem?
- Primeiro: objetos diferentes em arquivos diferentes podem ter nomes idênticos. No entanto, é você quem seleciona o objeto, seu nome e o arquivo de destino.
- Segundo: refatorar é muito mais fácil. Você sempre pode acompanhar uma classe, função ou qualquer outra entidade. Use uma pesquisa simples para localizar uma função e ver onde / como é usada.
- Terceiro: esse recurso faz com que os desenvolvedores pensem na estrutura do código (pelo menos até certo ponto).
Por outro lado, podemos mencionar apenas uma desvantagem -
importações circulares . No entanto, é um problema raro. Além disso, é um problema familiar, e os desenvolvedores sabem as maneiras de resolvê-lo.
É conveniente usar importações o tempo todo? Depende da sua preferência. Se você deseja ter mais controle sobre o código, prefere usar importações. Algumas equipes ainda têm regras que regulam a ordem de atribuição de código externo, para minimizar a quantidade de importações circulares. Se sua equipe não possui essas regras e você não quer se preocupar muito, basta confiar no IDE que importará automaticamente tudo o que você usa. Além disso: as importações não são um recurso exclusivo do Python, elas também são usadas em Java e C #.
Até o momento, não houve reclamações.
Parâmetros * args e ** kwargs em uma função
A sintaxe com parâmetros padrão geralmente é a mesma:
function makeyogurt($flavour, $type = "acidophilus") { return "Making a bowl of $type $flavour."; }
vs def makeyogurt(flavour, ftype="acidophilus"): return "Making a bowl of %s %s." % (ftype, flavour, )
No entanto, às vezes você pode precisar de uma função para um número desconhecido de argumentos.
Por exemplo, uma função de proxy, função de registro ou função para receber sinais. No PHP, a partir da versão 5.6, a seguinte sintaxe está disponível:
function sum(...$numbers) { $acc = 0; foreach ($numbers as $n) { $acc += $n; } return $acc; } echo sum(1, 2, 3, 4);
Respectivamente, em Python, você pode adicionar argumentos não nomeados em uma matriz e adicionar argumentos nomeados em um dicionário:
def acc(*args, **kwargs): total = 0 for n in args: total += n return total print(acc(1, 2, 3, 4))
Respectivamente,
* args - lista de argumentos não nomeados,
** kwargs - dicionário de argumentos nomeados.
Aulas
Dê uma olhada no código abaixo:
class BaseClass: def __init__(self): print("In BaseClass constructor") class SubClass(BaseClass): def __init__(self, value): super(SubClass, self).__init__()
As principais diferenças do PHP são as seguintes:
- self é usado em vez de $ this , e os métodos são sempre chamados usando o operador de acesso ("."). Além disso, o "eu" deve sempre ser o primeiro argumento em todos os métodos (bem, na maioria deles). O ponto é que o Python fornece a todos os métodos um link para o objeto com o primeiro argumento (o próprio objeto pode ser adicionado a uma variável com qualquer nome).
- Como no PHP, há um análogo de nomes mágicos . Em vez de __construct - __init__ . Em vez de __get - __getattr__ , etc.
- novo não é necessário. Criar uma instância de classe é o mesmo que chamar uma função.
- Uma chamada mais complexa para o método pai. Quanto ao super, você sempre precisa manter todos os detalhes em mente. parent :: Quanto ao PHP, a estrutura é menos volumosa.
Também devemos mencionar o seguinte:
- Mais de uma classe pode ser herdada.
- Nenhum público , protegido , privado . O Python permite alterar uma estrutura de instância (assim como toda a classe) em execução por meio de atribuição simples, portanto, nenhuma proteção é necessária. Assim, a reflexão também não é necessária. No entanto, há um análogo do estado protegido - sublinhado duplo antes do nome. No entanto, essa operação simplesmente altera o nome visível da variável / método para _% ClassName% __% varname% que permite trabalhar com dados ocultos.
- Sem estática, classes finais e interfaces. O modelo é mais baseado em objetos no Python em geral. Em vez de Singleton, você provavelmente terá um arquivo contendo todas as funções necessárias ou um arquivo que retorna a mesma instância ao importar. Em vez da interface, você provavelmente criará uma classe que gera exceções para métodos que não são reatribuídos por algum motivo (ou seja, a solução alternativa é possível).
- Não é desejado aplicar apenas programação orientada a objetos (OOP). Como tudo é um objeto de qualquer maneira (até booleano) e a sintaxe não possui operadores diferentes para chamar um método ou função de um arquivo importado, todas as chamadas são executadas com o operador de acesso ("."). Assim, o encapsulamento não requer necessariamente POO. Portanto, na maioria dos projetos, as classes são criadas onde são realmente necessárias.
Estilo de codificação
Eu trabalhei em vários projetos de longo prazo e notei que todos os membros da equipe têm um estilo de codificação diferente. Em muitos casos, um código pode ajudar a identificar o autor do código. Eu sempre quis que qualquer padrão de estilo de código fosse adotado para fins de consistência.
No entanto, sempre houve muitos argumentos ao aprovar este documento dentro da equipe. Esse problema também afeta o Python, mas em menor grau, pois existem várias recomendações de especialistas qualificados, o que definitivamente será suficiente para começar:
Além disso, existe o chamado Zen of Python. Uma de suas regras afirma que "deveria haver um - e de preferência apenas um - a maneira anterior de fazê-lo". Assim, um código não pode ser escrito de várias maneiras aproximadamente semelhantes. Claro, isso é idealismo, mas ajuda em muitos casos:
- Em vez de uma grande biblioteca de materiais contendo várias funções que se duplicam parcialmente, usamos um conjunto menor de métodos e bibliotecas de integração adicionais (por exemplo, para totais de hash).
- Em vez de strlen e count , sempre usamos len .
etc.
Versões em Python
Novas versões do PHP são sempre compatíveis com versões anteriores, embora algumas vezes sejam necessárias melhorias. Por outro lado, há Python 2 e Python 3. Eles são pouco incompatíveis por padrão. No entanto, recentemente, os desenvolvedores de Python melhoraram significativamente a situação. Você pode escrever um código para duas versões do Python, mas se você usar novos recursos do Python 3, como programação assíncrona ou novos recursos Unicode (UTF 8), provavelmente terá dificuldades. Por esse motivo, os projetos que já foram desenvolvidos e codificados por vários anos ainda usam o Python 2.
Mas para novos projetos, não há razão para usar o Python 2.
Aliases entre idiomas
Abaixo está a lista de palavras-chave que explicam a alternativa que o Python fornece à tecnologia que você está usando no momento.
- compositor -> pip
- mod_php -> mod_wsgi
- nginx + php-fpm -> nginx + uwsgi + uwsgi_python
- daemon.io -> tornado, torcido
- Zend Framework -> Django
- Falcão -> falcão
Conclusão
Como você sabe se precisa ou não?
- Você acredita que quanto mais forte a digitação, melhor.
- Você prefere um idioma que apresenta uma arquitetura bem organizada.
- Você é perfeccionista, a diversidade excessiva o incomoda.
- Os postos de trabalho Python em sua cidade parecem mais promissores (ou você se cansou de desenvolver apenas portais da web).
- Você deseja que sua linguagem de programação principal seja adequada para o desenvolvimento de qualquer tipo de software (considerando as restrições razoáveis relacionadas à digitação dinâmica).
- Você não gosta do nível de habilidade dos desenvolvedores juniores (devido à curva de aprendizado relativamente baixa).
Minha maneira de aprender Python
Se você é um desenvolvedor experiente, precisará de três semanas para aprendê-lo sem se esforçar muito.
- Primeira semana : Leia Dive Into Python , capítulos 2-7. Você pode examinar brevemente outros capítulos, prestando atenção apenas em pontos interessantes. Ao mesmo tempo, conclua 10 tarefas com o Project Euler . Por fim, crie um utilitário de console que aceite parâmetros. Você pode portar qualquer um dos scripts bash anteriores ou criar um análogo de ls no BusyBox ou algo novo. O ponto é que o script deve fazer algo útil, algo que você faz com frequência. Por exemplo, eu portado meu utilitário PHP que pode exibir dados no cache da memória.
- Segunda semana : Crie um simples análogo do Medium no Django e atire em qualquer hospedagem. Observe os componentes: registro, login, recuperação de senha, compartilhamento de postagens e comentários e remoção deles, verificação de permissões para ações.
- Terceira semana : selecione uma empresa na qual você gostaria de trabalhar, envie seu currículo solicitando uma tarefa de teste em Python para testar suas habilidades.
Boa sorte