代码之家  ›  专栏  ›  技术社区  ›  Yu Chen little_birdie

指示使用特定参数调用python函数而不执行它

  •  1
  • Yu Chen little_birdie  · 技术社区  · 6 年前

    我正在尝试编码逻辑以过滤pandas数据帧。我想将逻辑编码为字典,以子组名称为键,并将子组的筛选函数作为值:

    analytics_table_mappings = {
    "Jets Fans": BaseFilter.for_jets_fans,
    "Patriots Fans": BaseFilter.for_patriots_fans,
    ...
    }
    

    我的 BaseFilter.for_jets_fans BaseFilter.for_patriots_fans 是静态方法,包含为每组风扇筛选我的数据帧的逻辑。

    但是,我想创建一个函数 BaseFilter.for_team_fans 接受 team 字符串参数,指定要筛选哪个队的球迷。

    我目前的尝试是编码这样的东西

    analytics_table_mappings = {
    "Jets Fans": {"func": BaseFilter.for_team_fans, "args": "Jets"},
    "Patriots Fans":  {"func": BaseFilter.for_team_fans, "args": "Patriots"},
    ...
    }
    

    我的问题是:有没有一种更优雅、更不复杂、更易于维护的方法? 在上下文中,我是一个数据科学家,这是一个大型模型的一部分,我最终需要把它交给我的工程团队来维护和维护。他们要求我限制特定领域语言(DSL)的数量,以帮助软化学习曲线并提高代码库的可维护性。我想用

    "Jets Fans": {"func": BaseFilter.for_team_fans, "args": "Jets"},
    "Patriots Fans":  {"func": BaseFilter.for_team_fans, "args": "Patriots"}, 
    

    有可能迅速发展成为一个非常复杂和无法管理的DSL。我之所以对过滤逻辑进行编码,是因为我们过滤的度量类型和过滤方式可能会频繁演变,所以我没有将它们硬编码到我的代码基中,而是将过滤逻辑分开 configurations.py 由字典组成的文件。 analytics_table_mappings )因此,我希望在我的过滤器逻辑中保持灵活性,同时仍然使它对我的工程师是可维护的。

    附加项:

    我还需要能够处理必须传递多个参数的实例。例如:

        "Jets Fans": {"func": BaseFilter.for_team_fans, "args": "Jets"},
        "Patriots Fans":  {"func": BaseFilter.for_team_fans, "args": "Patriots"},
    "NFC Fans": {"func": BaseFilter.for_team_fans, "args": ["Bears", "Packers", ...]}
    
    2 回复  |  直到 5 年前
        1
  •  2
  •   jpp    6 年前

    你可以考虑 functools.partialmethod ,它允许您指定 args kwargs :

    from functools import partialmethod
    
    mappings = {'Jets Fans': partialmethod(BaseFilter.for_jets_fans, 'Jets'),
                'Patriots Fans': partialmethod(BaseFilter.for_patriots_fans, 'Patriots'),
                'NFC Fans': partialmethod(BaseFilter.for_team_fans, 'Bears', 'Packers')}
    
        2
  •  1
  •   ic3b3rg    6 年前

    如果 BaseFilter.for_team_fans analytics_table_mappings 然后你可以把它分解出来。因为只剩下一个属性,所以dict可以简化为 key: args 配对,例如

    analytics_table_mappings = {
        "Jets Fans": "Jets",
        "Patriots Fans": "Patriots",
        "NFC Fans": ["Bears", "Packers", ...]
    }
    

    然后将逻辑合并到一个简单的类中:

    class Teams:
        analytics_table_mappings = {
            "Jets Fans": "Jets",
            "Patriots Fans": "Patriots",
            "NFC Fans": ["Bears", "Packers", ...]
        }
    
        @classmethod
        def get_teams(cls, fan_type):
            if fan_type not in cls.analytics_table_mappings:
                return 'Invalid fan type: {}'.format(fan_type)
            teams = cls.analytics_table_mappings[fan_type]
            if not isinstance(teams, list):
                teams = [teams]
            return [cls.for_team_fans(team) for team in teams]
    
        def for_team_fans(team_name):
            # your logic here
            return team_name
    
    
    print(Teams().get_teams("Jets Fans"))
    >> ['Jets']
    
    print(Teams().get_teams("Patriots Fans"))
    >> ['Patriots']
    
    print(Teams().get_teams("NFC Fans"))
    >> ['Bears', 'Packers', ...]
    
    print(Teams().get_teams("Argonauts Fans"))
    >> Invalid fan type: Argonauts Fans