如何从python minidom中获取布尔值

如何从python minidom中获取布尔值,python,xml,minidom,Python,Xml,Minidom,这让我很难过: me@here ~ $ python Python 2.7.8 (default, Oct 20 2014, 09:44:42) [GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> b=False >>> b False >>> st

这让我很难过:

me@here ~
$ python
Python 2.7.8 (default, Oct 20 2014, 09:44:42)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> b=False
>>> b
False
>>> str(b)
'False'
>>> s=str(b)
>>> s
'False'
>>> b=bool(s)
>>> b
True
>>>
那么,如何使用minidom从xml文档中获取布尔值呢?getAttribute给了我一个字符串,我总是可以这样做:

attr = el.getAttribute( 'bodacious' )
if attr in [ '1', 'true', 'True', 'TRUE', 'y', 'Y', 'yes', 'Yes', 'YES' ]:
    return True # a bodacious element
else:
    return False # a most non-bodacious element

但这似乎相当武断。有更好的方法吗?

如果这些都是在你的小世界里可以实现的,那么是的。不过,您可以更简洁一点:

attr = el.getAttribute( 'bodacious' ).lower()
return attr in ( '1', 'true', 'y', 'yes' )
或者甚至将其内联:

return el.getAttribute( 'bodacious' ).lower() in ( '1', 'true', 'y', 'yes' )
不过,如果您经常这样做,您会希望提取真实值列表,例如:

TRUE_VALS = ( '1', 'true', 'True', 'y', 'yes', 'Y', 'Yes', 'YES' )
然后:

return el.getAttribute( 'bodacious' ) in TRUE_VALS:

一方面:python如何从对象中获取布尔值

每个python对象都有一个内在的布尔值。一般来说,每个对象都是真实的(即当传递到
bool
时返回
True
),除非它是
'
None
0
False
或空容器(如
[]
{}
)。(您可以在自己的类中自定义此行为)

这意味着,任何非空字符串都有一个truthy值,这可能会导致使用隐式类型强制的其他语言(如PHP或JS)的人混淆结果。但它是一致的,这是编程时需要的:

>>> bool('False')
True
>>> bool('Very false')
True
>>> bool('')
False
>>> bool('0')
True
另一方面:XML作为数据传输语言很糟糕

你需要跟踪真实或虚假的价值观。如果您想定义真值,而其余的都是假值,则可以执行以下操作:

# Define this in load-time code instead of runtime to avoid redefining it on each call.
truthy_values = {'true', '1', ...}
...
# Then, in some function, check the value in this way:
return attr.lower() in truthy_values
这样可以最大限度地减少您必须处理的特殊情况。它还包含许多风险,例如
'0'
将返回
True


无论如何,我真正的建议是一劳永逸地放弃XML。如果您使用JSON或YAML,您的生活会更好、更令人满意。

非空序列(包括字符串)在Python中计算truthy-这通常很有用!除了使用单个大小写(例如…中的
attr.lower())和清理输入(为什么有这么多可能的“布尔值”?)之外,没有什么更整洁的了。
bool(str)
不会将布尔字符串名称转换为
bool
类型。相反,如果str:
,它的作用与
相同,因此保持一致性很重要。请看,您可以添加自己的方法来检查字符串实际上是否为布尔值。但据我所知,没有其他方法。有这么多布尔值,因为许多必须编辑此文件的工程师将在接下来的五年中试图让解析器识别他们自己对xml中“bool”应该是什么的看法,然后失败,然后他们将对当前脚本的任何人发出牢骚,直到它成功作为另一个选项添加。这并不漂亮,但这正是痛苦的经历让我所期待的。哦,是的,我在过去的两年里一直在工作中与YAML Jihad作斗争,但这个特定的文件目前必须保持XML格式!我只是好奇人们认为从属性中获取布尔值的“自然”方式应该是什么。(为错误的编辑感到抱歉-我希望这很明显是不称职的,而不是拖拉)@PatB是的,不用担心,这很明显:)如果您仍然需要使用XML,我会确保只有两个可能的字符串值进入该字段,比如
True
False
,然后使用字典
{'True':True,'False':False}
来获取您要查找的值。如果它不适合,让它崩溃。。。