Ich möchte einen String-Wert von "false" in einen Bool-Wert von False konvertieren. Gibt es einen guten Weg?
Wenn Sie etwas weiter gehen, sieht es aus wie Boolean.Parse in C #. Gibt es irgendetwas? Das ist.
Ich frage mich, ob distutils.util.strtobool () + bool (), das später beschrieben wird, gelöscht werden sollte.
Vorher habe ich darüber nachgedacht.
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
Damit kann das in "Der Anfang der Sache" erwähnte Problem nicht gelöst werden.
Gemäß der offiziellen Python 2.6-Dokumentation 5. Integriert> 5.1. Wahrheitstest können die folgenden Werte falsch sein: Sonst ist es wahr.
None
False
0
, 0L
, 0.0
, 0j
.''
, ()
, []
.{}
.$ 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()
Der "Anfang der Dinge" kann behoben werden, unterscheidet sich jedoch von der ursprünglichen Verwendung von json.loads (), sodass es für andere möglicherweise schwierig ist, ihn zu lesen. Da davon ausgegangen wird, dass der JSON-Wert eingegeben wird, wird er nur übergeben, wenn er niedriger als "false" ist. Bei Einstellung auf "False" tritt ein Wertefehler auf.
$ 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
Dies kann auch den "Anfang der Dinge" beseitigen. Außerdem unterscheidet sich ast.literal_eval () von simple eval () darin, dass die Konvertierung auf Literalwerte eingegrenzt wird. Daher ist das Risiko gering, selbst wenn Variablen analysiert werden, die nicht wissen, wo sich die Knochen befinden. "False" kann jedoch nicht analysiert werden.
$ 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
Dies kann auch den "Anfang der Dinge" beseitigen. Die Absicht ist auch leicht zu verstehen. Es kann auch den Unterschied zwischen Groß- und Kleinschreibung absorbieren. Es scheint jedoch besser, daraus eine Methode zu machen und sie irgendwo zusammenzustellen. Wenn jedoch eine andere Variable als eine Zeichenfolge eingegeben wird, tritt ein Fehler auf.
$ 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
Dies kann auch den "Anfang der Dinge" beseitigen. Die Absicht ist auch leicht zu verstehen. Es misst auch Zeichenfolgen mit der Absicht von Wahr / Falsch. Wenn jedoch eine Zeichenfolge eingegeben wird, die nicht das Konvertierungsziel ist, tritt eine Ausnahme auf. Nehmen Sie sie daher ordnungsgemäß auf.
$ 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 ''
――Wenn es einen anderen guten Weg gibt, hinterlassen Sie bitte einen Kommentar.
Recommended Posts