O Python tem algo como uma variável de cadeia vazia, onde você pode fazer:
if myString == string.empty:
Independentemente disso, qual é a maneira mais elegante de verificar valores de string vazios? Acho sempre difícil codificar ""
sempre que checar uma string vazia não é tão boa.
python
string
comparison-operators
Joan Venge
fonte
fonte
""
não é tão bom?Respostas:
Seqüências de caracteres vazias são "falsas", o que significa que são consideradas falsas em um contexto booleano; portanto, você pode fazer isso:
Essa é a maneira preferida se você souber que sua variável é uma sequência. Se a sua variável também puder ser de outro tipo, você deve usar
myString == ""
. Consulte a documentação em Truth Value Testing para outros valores que são falsos em contextos booleanos.fonte
if not myString:
bloco semyString
foramNone
,0
,False
etc Então, se você não tiver certeza de que tipomyString
for, você deve usarif myString == "":
para determinar se ele é uma cadeia vazia em oposição a algum outro valor falso.if myString == ...
expressões, poderíamos usarif myString in (None, '')
ou por @Bartek,if myString in (None, '') or not myString.strip()
No PEP 8 , na seção "Recomendações de programação" :
Então você deve usar:
ou:
Apenas para esclarecer, as seqüências são avaliadas para
False
ouTrue
em um contexto booleano se estiverem vazias ou não. Eles não são iguais aFalse
ouTrue
.fonte
x == False
. Mas IMHO o esclarecimento ainda é bem-vindo, dado o público-alvo.A maneira mais elegante provavelmente seria simplesmente verificar se é verdadeiro ou falso, por exemplo:
No entanto, convém remover o espaço em branco porque:
No entanto, você provavelmente deve ser um pouco mais explícito, a menos que saiba com certeza que essa sequência passou por algum tipo de validação e é uma sequência que pode ser testada dessa maneira.
fonte
Eu testaria a não-união antes de me despir. Além disso, eu usaria o fato de que cadeias vazias são falsas (ou falsas). Essa abordagem é semelhante à StringUtils.isBlank do Apache ou à Strings.isNullOrEmpty do Guava
Isto é o que eu usaria para testar se uma string é None OR Empty OR Blank:
E, exatamente o oposto para testar se uma string não é None NOR Empty NOR Blank:
Formas mais concisas do código acima:
fonte
if mystring and not mystring.strip()
?string and not string.isspace()
?def isBlank(s): return not (s and s.strip())
edef isNotBlank(s): return s and s.strip()
.Certa vez, escrevi algo semelhante à resposta de Bartek e o javascript inspirou:
Teste:
fonte
return bool(s.strip())
AttributeError: 'NoneType' object has no attribute 'strip'
A única maneira realmente sólida de fazer isso é a seguinte:
Todas as outras soluções têm possíveis problemas e casos extremos onde a verificação pode falhar.
len(myString)==0
pode falhar semyString
for um objeto de uma classe que herdastr
e substitui o__len__()
métodoDa mesma forma
myString == ""
emyString.__eq__("")
pode falhar semyString
substituir__eq__()
e__ne__()
.Por alguma razão,
"" == myString
também é enganado se formyString
substituído__eq__()
.myString is ""
e"" is myString
são equivalentes. Ambos falharão semyString
não for realmente uma string, mas uma subclasse de string (ambos retornarãoFalse
). Além disso, como são verificações de identidade, a única razão pela qual eles funcionam é porque o Python usa String Pooling (também chamado String Internment), que usa a mesma instância de uma string se for internada (veja aqui: Por que comparar cadeias usando '= = 'ou' é 'às vezes produz um resultado diferente? ). E""
é internado desde o início no CPythonO grande problema com a verificação de identidade é que o String Internment é (até onde eu pude encontrar) que não está padronizado quais strings são internadas. Isso significa que, teoricamente
""
não é necessário internado e isso depende da implementação.A única maneira de fazer isso que realmente não pode ser enganado é o mencionado no início:
"".__eq__(myString)
. Como isso chama explicitamente o__eq__()
método da string vazia, não pode ser enganado substituindo nenhum método em myString e trabalhando solidamente com subclasses destr
.Também depender da falsidade de uma string pode não funcionar se o objeto substituir o
__bool__()
método.Este não é apenas um trabalho teórico, mas pode realmente ser relevante em uso real, já que eu vi estruturas e bibliotecas subclassificando
str
antes e usando,myString is ""
podendo retornar uma saída errada lá.Além disso, comparar seqüências de caracteres usando
is
em geral é uma armadilha bastante ruim, pois funcionará corretamente algumas vezes, mas não em outras, porque o pool de strings segue regras bastante estranhas.Dito isto, na maioria dos casos, todas as soluções mencionadas funcionarão corretamente. Este post é principalmente um trabalho acadêmico.
fonte
Teste a cadeia vazia ou em branco (maneira mais curta):
fonte
myString = None
, isso gerará uma exceção. Melhor utilização de @ abóbada respostaSe você quiser diferenciar entre cadeias vazias e nulas, sugiro usar
if len(string)
, caso contrário, sugiro usar simplesmenteif string
como já foi dito. A ressalva sobre strings cheias de espaço em branco ainda se aplica, portanto, não esqueçastrip
.fonte
if stringname:
dá afalse
quando a string está vazia. Eu acho que não pode ser mais simples que isso.fonte
Abordagem de código limpo
Fazer isso:
foo == ""
é uma prática muito ruim.""
é um valor mágico. Você nunca deve verificar valores mágicos (mais conhecidos como números mágicos )O que você deve fazer é comparar com um nome descritivo de variável.
Nomes de variáveis descritivos
Pode-se pensar que "empty_string" é um nome de variável descritivo. Não é .
Antes de você ir e fazer
empty_string = ""
e achar que tem um ótimo nome de variável para comparar. Não é isso que "nome descritivo da variável" significa.Um bom nome de variável descritiva é baseado em seu contexto. Você tem que pensar sobre o que a cadeia vazia é .
Exemplo de campo de formulário simples
Você está criando um formulário em que um usuário pode inserir valores. Você deseja verificar se o usuário escreveu algo ou não.
Um bom nome de variável pode ser
not_filled_in
Isso torna o código muito legível
Exemplo completo de análise de CSV
Você está analisando arquivos CSV e deseja que a sequência vazia seja analisada como
None
Como o CSV é inteiramente baseado em texto, ele não pode ser representado
None
sem o uso de palavras-chave predefinidas.Um bom nome de variável pode ser
CSV_NONE
Isso facilita a alteração e a adaptação do código se você tiver um novo arquivo CSV que represente
None
outra string que não""
Não há dúvidas sobre se esse trecho de código está correto. É bastante claro que ele faz o que deve fazer.
Compare isso com
A primeira pergunta aqui é: por que a string vazia merece tratamento especial?
Isso diria aos futuros codificadores que uma string vazia sempre deve ser considerada como
None
.Isso ocorre porque ele combina a lógica de negócios (que valor CSV deve ser
None
) com a implementação do código (com o que estamos realmente comparando)É preciso haver uma separação de preocupações entre os dois.
fonte
""
não é um valor mágico, mesmo queTrue
,False
ouNone
não são valores mágicos.fonte
a='a'
, obteriaa.isspace() -> False
, masa
não seria nessa conta uma string vazia.Que tal agora? Talvez não seja "o mais elegante", mas parece bastante completo e claro:
fonte
Respondendo a @ 1290. Desculpe, não há como formatar blocos nos comentários. O
None
valor não é uma string vazia no Python e nem é (espaços). A resposta de Andrew Clark é a correta:if not myString
. A resposta de @rouble é específica do aplicativo e não responde à pergunta do OP. Você terá problemas se adotar uma definição peculiar do que é uma string "em branco". Em particular, o comportamento padrão é questr(None)
produz'None'
uma string não em branco.No entanto, se você deve tratar
None
e (espaços) como seqüências de caracteres "em branco", aqui está uma maneira melhor:Exemplos:
Atende aos requisitos @rouble, sem quebrar o
bool
comportamento esperado das strings.fonte
python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
Acho isso elegante, pois garante que seja uma string e verifique seu comprimento:
fonte
-O
sinalizador ou definir aPYTHONOPTIMIZE
variável env.Outra maneira fácil seria definir uma função simples:
fonte
Essa expressão é verdadeira para cadeias vazias. Seqüências de caracteres não vazias, Nenhum e objetos que não sejam de seqüência de caracteres produzirão Falso, com a ressalva de que os objetos podem substituir __str__ para impedir essa lógica, retornando um valor falso.
fonte
Você pode dar uma olhada neste Atribuindo valor ou sequência vazia em Python
Trata-se de comparar cadeias que estão vazias. Então, em vez de testar o vazio
not
, você pode testar se sua string é igual a uma string vazia com""
a string vazia ...fonte
para quem espera um comportamento como o apache StringUtils.isBlank ou Guava Strings.isNullOrEmpty :
fonte
Quando você estiver lendo o arquivo por linhas e quiser determinar qual linha está vazia, verifique se você usará
.strip()
, pois há um novo caractere de linha na linha "vazia":fonte
fonte
Se você apenas usar
não é possível diferenciar uma variável que é booleana
False
de uma string vazia''
:No entanto, se você adicionar uma condição simples ao seu script, a diferença será feita:
fonte
Caso isso seja útil para alguém, aqui está uma função rápida criada para substituir cadeias de caracteres em branco por N / A em listas de listas (python 2).
Isso é útil para postar listas de listas em um banco de dados mysql que não aceita espaços em branco para determinados campos (campos marcados como NN no esquema. No meu caso, isso ocorreu devido a uma chave primária composta).
fonte
Eu fiz algumas experiências com seqüências de caracteres como '', '', '\ n' etc. etc. Quero que isNotWhitespace seja True se e somente se a variável foo for uma string com pelo menos um caractere que não seja um espaço em branco. Estou usando o Python 3.6. Aqui está o que eu acabei com:
Embrulhe isso em uma definição de método, se desejar.
fonte
Como prmatta postado acima, mas com erro.
fonte
""
e" "
e False para"a"
(exatamente como esperado). Seu código retorna o mesmo, exceto pela string vazia que retorna True, o que não deveria.