[英]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.