我有一堆变量等于从数据库中提取的值。有时,数据库没有值并返回“NoneType”。我正在使用这些变量并使用它们来构建XML文件。当变量为NoneType时,它会使XML值读为“None”而不是我想要的空白。
我的问题是:是否有一种有效的方法可以同时检查所有变量并搜索NoneType,如果找到,则将其变为空白字符串?
离。
from types import *
[Connection to database omitted]
color = database.color
size = database.size
shape = database.shape
name = database.name
... etc
我显然可以这样做:
if type(color) is NoneType:
color = ""
但对于我拥有的15个以上的变量来说,这将变得乏味。是否有更有效的方法来检查每个变量的类型,然后在必要时进行更正?有什么比创建一个函数来进行检查/修正以及通过该函数自动传递每个变量的方法吗?
答案 0 :(得分:3)
这里给出的所有解决方案都会使你的代码更短,更乏味,但如果你真的有很多变量,我想你会很感激,因为它不会让你添加甚至一个额外的字符每个变量的代码:
class NoneWrapper(object):
def __init__(self, wrapped):
self.wrapped = wrapped
def __getattr__(self, name):
value = getattr(self.wrapped, name)
if value is None:
return ''
else:
return value
mydb = NoneWrapper(database)
color = mydb.color
size = mydb.size
shape = mydb.shape
name = mydb.name
# All of these will be set to an empty string if their
# original value in the database is none
我认为这很明显,但我一直都忘记了所有有趣的Python魔法成为第二天性所需要的时间。 :)那么NoneWrapper
如何发挥其魔力呢?真的很简单。每个python类都可以定义一些易于识别的“特殊”方法名称,因为它们总是被每侧的两个下划线包围。这些方法中最常见和众所周知的是__init__()
,它初始化了类的每个实例,但还有许多其他有用的特殊方法,其中之一是__getattr__()
。只要有人试图访问属性,就会调用此方法。您的类的实例,您可以自定义它以自定义属性访问。
NoneWrapper的作用是覆盖 getattr ,因此每当有人试图读取mydb的属性(这是一个NoneWrapper实例)时,它会读取具有指定名称的属性从包装对象(在本例中为database
)并返回它 - 除非它的值为None,在这种情况下它返回一个空字符串。
我应该在这里补充说,对象变量和方法都是属性,事实上,对于Python来说,它们基本上是一回事:所有属性都是可以改变的变量,而方法恰好是具有其价值的变量设置为特殊类型的函数(绑定方法)。因此,您还可以使用 getattr ()来控制对函数的访问,这可能会导致许多有趣的用途。
答案 1 :(得分:0)
你可以简单地使用:
color = database.color or ""
另一种方法是使用函数:
def filter_None(var):
"" if (a is None) else a
color = filter_None(database.color)
我不知道数据库对象的结构如何,但另一种解决方案是修改database
对象,如:
def myget(self, varname):
value = self.__dict__[varname]
return "" if (value is None) else value
DataBase.myget = myget
database = DataBase(...)
[...]
color = database.myget("color")
你可以使用描述符或属性做得更好
答案 2 :(得分:0)
我会这样做,虽然我不知道它是否是最好的,但是将你要检查的变量放在一起,然后使用for语句迭代列表。
check_vars = [color,size,shape,name]
for var in check_vars:
if type(var) is NoneType:
var = ""
要添加变量,您只需将它们添加到列表中即可。
答案 3 :(得分:0)
如果您已经一次获得一个,那么写作时间不会太长:
def none_to_blank(value):
if value is None:
return ""
return value
color = none_to_blank(database.color)
size = none_to_blank(database.size)
shape = none_to_blank(database.shape)
name = none_to_blank(database.name)
顺便说一句,一般不鼓励使用“import *”。仅导入您正在使用的内容。