python - 在Python中使用lambda或helper方法来避免for循环重复

标签 python lambda

我有以下简单的类,我想知道是否有一种简单的方法来使用 lambdadecoratorhelper 方法,等等...以避免在 CODENAMESALL_DEFAULTS 中的每个方法中出现重复的 for 循环

class classproperty(object):
    """
    When used to decorate a method in a class, that method will behave
    like as a class property.
    """
    def __init__(self, f):
        # f - the func that's being decorated
        self.f = f

    def __get__(self, obj, cls):
        # call the func on the class
        return self.f(cls)

class PermissionInfo(object):

    MODELS = ['ticket', 'person', 'role']
    PERMS = ['view', 'add', 'change', 'delete']

    @classproperty
    def CODENAMES(cls):
        codenames = []
        for p in cls.PERMS:
            for m in cls.MODELS:
                codenames.append('{}_{}'.format(p, m))
        return codenames

    @classproperty
    def ALL_DEFAULTS(cls):
        ret = {}

        for p in cls.PERMS:
            for m in cls.MODELS:
                ret["{}_{}".format(p, m)] = False

        return ret

重复的 for 循环是每个方法的这一部分:

# ...
for p in cls.PERMS:
    for m in cls.MODELS:
#...

最佳答案

您可以使用 itertools.product在辅助方法中生成名称:

from itertools import product

def names(cls):
    yield from ('_'.join(x) for x in product(cls.PERMS, cls.MODELS))

然后你可以更改你的类来使用它:

@classproperty
def CODENAMES(cls):
    return list(names(cls))

@classproperty
def ALL_DEFAULTS(cls):
    return dict.fromkeys(names(cls), False)

关于python - 在Python中使用lambda或helper方法来避免for循环重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41112251/

相关文章:

Python 对字符串列表进行排序

python - 控制 Altair 区域的堆栈顺序

python - 如何将字符串插入到另一个具有相同多次出现的字符串中

linq - 将此 Linq 查询从查询​​语法转换为 lambda 表达式

ruby-on-rails - Rails : named_scope, lambda 和 block

python - 如何在 sys.settrace 中打印函数参数?

python - 如何在球面上绘制具有方位角和仰角的热图以及每个位置的相应值

c++ - 不能将lambda用作unordered_set对的哈希?

c++ - 在 decltype(auto) 的情况下,lambda 是否有特殊规则?

python - "Lazy"Python中的列表项评估