簡體   English   中英

Python:通過函數放置多個變量的有效方法

[英]Python: Efficient way to put multiple variables through a function

我有一堆等於從數據庫中提取的值的變量。 有時,數據庫沒有值並返回“ 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個以上變量將變得乏味。 有沒有更有效的方法來檢查每個變量的類型,然后根據需要進行更正? 像創建一個函數來執行檢查/更正,並具有通過該函數傳遞每個變量的自動方法?

此處給出的所有解決方案將使您的代碼更短,更少繁瑣,但是,如果您確實有很多變量,我想您將不勝感激,因為它不會使您為每個變量甚至添加一個額外的代碼字符

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如何NoneWrapper其魔力? 真的,這非常簡單。 每個python類都可以定義一些易於識別的“特殊”方法名稱,因為它們總是被兩側的兩個下划線所包圍。 這些方法中最常見和最著名的是__init__() ,它可以初始化類的每個實例,但是還有許多其他有用的特殊方法,其中之一是__getattr__() 每當有人嘗試訪問屬性時,都會調用此方法。 類實例的實例,您可以對其進行自定義以自定義屬性訪問。

NoneWrapper的作用是重寫getattr ,因此,每當有人嘗試讀取mydb的屬性(這是一個NoneWrapper實例)時,它都會從包裝的對象(在本例中為database )中讀取具有指定名稱的屬性,並返回它-除非它的值為None,在這種情況下,它將返回一個空字符串。

我在這里應該補充一點,對象變量和方法都是屬性,實際上,對於Python,它們本質上是同一件事:所有屬性都是可以更改的變量,而方法恰好是將其值設置為a的變量。特殊類型的功能(綁定方法)。 因此,您還可以使用getattr ()來控制對函數的訪問,這可能會導致許多有趣的用途。

您可以簡單地使用:

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")

您可以使用描述符或屬性做得更好

盡管我不知道這是否是最好的方法,但我將這樣做的方法是放入要檢查的變量,然后使用for語句遍歷列表。

check_vars = [color,size,shape,name]
for var in check_vars:
    if type(var) is NoneType:
        var = ""

要添加變量,您要做的就是將它們添加到列表中。

如果您一次已經有了一個,那么寫它就不再那么長了:

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 *”。 僅導入您正在使用的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM