在Python lambda表达式中处理len()中的NoneType?

Kum*_*mba 0 python lambda python-2.4

据我所知,Python lambda只允许表达式,而不是语句.我有一个案例,我len()在lambda表达式中使用并尝试获取函数调用的返回值的长度.但是,该函数调用有可能返回None,这会中断len().这周围有优雅的方式吗?

例:

def foo(obj_list, field):
    return maxk(obj_list, key=lambda obj: len(nested_getattr(obj, field)))
Run Code Online (Sandbox Code Playgroud)

在上面,maxk()是一个max()接受key参数的版本.我正在使用Python 2.4(并且目前不能使用更高的东西),所以我有一个自定义实现max(),需要一个关键参数,来自这里(参见帖子#140122和#140143). nested_getattr()是另一个实用程序函数,其行为类似getattr()但可以获取嵌套在另一个中的属性.这可以从这里获得.

示例函数的作用(这是我用变量/名称改变的实际函数)是通过一个对象列表(obj_list)并比较值的长度field并返回列表field中最大的对象.

但是,如果field为每个对象指定的属性返回None,len()则将使用a阻塞TypeError.我想我可以使用内联条件绕过它,但是我必须调用nested_getattr()两次,一次用于检查,如果返回值不是,则可能第二次None.我宁愿将其返回值缓存到变量并在决定返回什么之前在条件上运行它(或者只是让生成器表达式完全跳过它).

处理这个问题的好方法是什么?我对这个函数的其他实现是开放的maxk(),或者nested_getattr()(如果需要的话).

Bre*_*arn 5

只需将函数单独定义为常规函数,然后将其传递给maxk:

def getLen(obj):
    val = nested_getattr(obj, field)
    if val is None:
        return 0
    else:
        return len(val)
return maxk(obj, key=getLen)
Run Code Online (Sandbox Code Playgroud)

当编写内联单表达式函数更容易编写单独的函数时,可以使用Lambdas.如果想到如何编写lambda变得比写一个普通函数更难,那就写一个普通的函数.没花点时间如何将它融入lambda中,因为在这种情况下lambda不会获得任何东西.

编辑:Lambdas与非lambda函数的字节码相同,它们执行相同的操作.

>>> f = lambda x: x**2
>>> def g(x):
...     return x**2
>>> import dis
>>> dis.dis(f)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               1 (2)
              6 BINARY_POWER        
              7 RETURN_VALUE        
>>> dis.dis(g)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               1 (2)
              6 BINARY_POWER        
              7 RETURN_VALUE     
Run Code Online (Sandbox Code Playgroud)