2014-01-16 50 views
0

我正在写一个函数,它从数据库获取用户并返回用户对象列表。 功能签名,如下所示:用通用函数转换函数的所有输入参数

def select_users(self,userid,firstname,lastname,emailid,tenants,groups): 
    result = self.authservice.select_users(userid,firstname,lastname,emailid,tenants,groups) 

在这个函数中,我称之为authservice对象select_users方法将返回自定义用户对象的列表。但是,如果任何输入参数具有''值,则必须将其转换为None,因为self.authservice.select_users无法处理空字符串。如果它是空的,我可以检查每个元素值并将其转换为None,但我希望它是通用的和可重用的。如果我可以写一个不同的函数,可以给我更新输入参数列表,这将是非常有用的。请让我知道我该怎么做?

回答

2

我会写一个通用的装饰,这样

def convert_empty_to_none(func): 
    def inner_function(*args, **kwargs): 
     args = (None if item == "" else item for item in args) 
     kwargs = {k:(None if v == "" else v) for k, v in kwargs.items()} 
     return func(*args, **kwargs) 
    return inner_function 

@convert_empty_to_none 
def test_function(a, b, c): 
    print a, b, c 

test_function("", "", "") 

输出

None None None 
+1

@ gliese581g不客气:)我强烈建议你阅读[这个优秀的答案](http://stackoverflow.com/a/1594484/1903116)了解更多关于装饰。 – thefourtheye

2

恶道

def select_users(self, *args): 
    new_args = [(None if arg == '' else arg) for arg in args] 
    result = self.authservice.select_users(*new_args) 

装饰解决方案也很邪恶:改变函数的参数饶写了几个函数调用似乎不是个好主意。

在现实生活中我会明确的去:

def never_blank(s): 
    return None if s == '' else s 

def select_users(self, userid,firstname,lastname,emailid,tenants,groups): 
    result = self.authservice.select_users(userid,never_blank(firstname),never_blank(lastname),emailid, 
          never_blank(tenants),groups) 

乏味?当然。清洁?是的。未来会叮you你吗?不。

+0

这是有益的,但我并不想修改自己的函数签名,但我想具有可以从该函数调用的其他函数以及其他函数来获取更新的参数列表。 – gliese581g

+3

如果'arg'是'False','0'或'[]'怎么办? – thefourtheye

1

创建一个函数,并使用它像一个功能型的装饰

def sanitize(func): 
    def handler(*args, **kwargs): 
     args = (e if e != '' else None for e in args) 
     kwargs = {k:(v if v != '' else None) for k, v in kwargs.items()} 
     return func(*args, **kwargs) 
    return handler 

@sanitize 
def select_users(self,userid,firstname,lastname,emailid,tenants,groups): 
    result = self.authservice.select_users(userid,firstname,lastname,emailid,tenants,groups) 

了好处

  1. 你并不需要修改签名
  2. 主叫方仍然有清晰的思路,函数期望什么参数
  3. 通用并可用于任何函数调用
  4. 是一个装饰,所以可以很容易地在一个非侵入性的方式使用
1

你可以使用一个装饰创建一个通用的包装,将与None替换每空字符串。

def none_for_empty_string(func): 

    def wrapper(*args, **kwargs): 

     args = tuple(arg if arg != '' else None for arg in args) 
     kwargs = {k : v if v != '' else None for k, v in kwargs.iteritems()} 
     return func(*args, **kwargs) 

    return wrapper 

@none_for_empty_string 
def select_users(self,userid,firstname,lastname,emailid,tenants,groups): 
    ... 
+1

语法不正确。它应该是'arg如果arg!=''否则无参数arg',就像我的答案一样。 – thefourtheye

+0

derp。愚蠢的错误。 –