Je veux convertir une valeur String de "false" en une valeur booléenne de False, y a-t-il un bon moyen?
En allant un peu plus loin, il ressemble à Boolean.Parse en C #. Y a-t-il quelque chose? C'est.
Je me demande si distutils.util.strtobool () + bool (), qui sera décrit plus tard, doit être abandonné.
Avant ça, j'y pensais.
def CBool( value ):
if isinstance( value, str ) and value.lower() == "false":
return False
return bool( value )
$ python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def CBool( value ):
... if isinstance( value, str ) and value.lower() == "false":
... return False
... return bool( value )
...
>>> CBool( "False" )
False
>>> CBool( "false" )
False
>>> CBool( 0 )
False
>>> CBool( [] )
False
>>> CBool( "" )
False
>>> CBool( "True" )
True
>>> CBool( 1 )
True
>>> CBool( [ "hoge" ] )
True
>>> CBool( "hoge" )
True
Avec cela, le problème mentionné dans "Le début de la question" ne peut pas être résolu.
Selon la documentation officielle de Python 2.6 5. Built-in> 5.1. Truth Test, les valeurs suivantes peuvent être fausses: , Sinon, c'est vrai.
None
False
0 '',
0L '', 0.0 '',
0j``.''
, ()
, []
.__nonzero__
ou __len__
définies, ces méthodes renvoient une valeur entière de zéro ou une valeur bool
de` False
.$ python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> bool( "False" )
True
json.loads()
Le "début des choses" peut être résolu, mais il est différent de l'utilisation originale de json.loads (), donc il peut être difficile pour les autres de comprendre l'intention. De plus, comme il est supposé que la valeur JSON sera entrée, elle ne passera pas à moins qu'elle ne soit inférieure à "false". S'il est défini sur "False", une erreur de valeur se produira.
$ python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>> json.loads( "false" )
False
>>> json.loads( "False" )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads
return _default_decoder.decode(s)
File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib64/python2.6/json/decoder.py", line 338, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Cela peut également éliminer le «début des choses». De plus, ast.literal_eval () est différent de simple eval () en ce que la conversion est réduite à des valeurs littérales, le fait est donc que le risque est faible même lors de l'analyse de variables qui ne savent pas où se trouvent les os. Cependant, "false" ne peut pas être analysé.
$ python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ast
>>> ast.literal_eval( "False" )
False
>>> ast.literal_eval( "false" )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/ast.py", line 68, in literal_eval
return _convert(node_or_string)
File "/usr/lib64/python2.6/ast.py", line 67, in _convert
raise ValueError('malformed string')
ValueError: malformed string
Cela peut également éliminer le «début des choses». L'intention est également facile à comprendre. Il peut également absorber la différence entre les majuscules et les minuscules. Cependant, il semble préférable d'en faire une méthode et de la mettre ensemble quelque part. Cependant, si une variable autre qu'une chaîne de caractères est entrée, une erreur se produit.
$ python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> False if "False".lower() == "false" else True
False
>>> False if "false".lower() == "false" else True
False
>>> False if "True".lower() == "false" else True
True
Cela peut également éliminer le «début des choses». L'intention est également facile à comprendre. Il mesure également les chaînes avec l'intention de True / False. Cependant, si une chaîne de caractères qui n'est pas la cible de conversion est saisie, une exception se produira, alors sélectionnez-la correctement.
$ python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import distutils.util
>>> distutils.util.strtobool( "False" )
0
>>> distutils.util.strtobool( "false" )
0
>>> bool( distutils.util.strtobool( "False" ) )
False
>>> bool( distutils.util.strtobool( "No" ) )
False
>>> distutils.util.strtobool( "True" )
1
>>> bool( distutils.util.strtobool( "True" ) )
True
>>> bool( distutils.util.strtobool( "" ) )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/distutils/util.py", line 424, in strtobool
raise ValueError, "invalid truth value %r" % (val,)
ValueError: invalid truth value ''
――S'il existe un autre bon moyen, veuillez laisser un commentaire.
Recommended Posts