Python:通过函数放置多个变量的有效方法

时间:2011-05-20 18:59:19

标签: python

我有一堆变量等于从数据库中提取的值。有时,数据库没有值并返回“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个以上的变量来说,这将变得乏味。是否有更有效的方法来检查每个变量的类型,然后在必要时进行更正?有什么比创建一个函数来进行检查/修正以及通过该函数自动传递每个变量的方法吗?

4 个答案:

答案 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 *”。仅导入您正在使用的内容。