代码之家  ›  专栏  ›  技术社区  ›  marcin2x4

Python作为装饰器的列表理解(包括self)

  •  0
  • marcin2x4  · 技术社区  · 3 年前

    我有两个功能:

    job_status 正在从boto3api获得响应。

    jobs_details 是一个列表理解 作业状态 在输入列表的每个元素上。

    我想改变 作业详细信息 成为 jobs_status 但低于解决方案 inner() takes 1 positional argument but 2 were given 错误

    感谢对我的问题的任何评论/替代方法。谢谢

    import boto3
    
    class GlueClient:
    
        def __init__(self):
            self.glue_client = boto3.client('glue')
            #self.envs = envs
    
        def jobs_list(self):
            response = self.glue_client.list_jobs()
            result = response["JobNames"]
    
            while "NextToken" in response:
                response = self.glue_client.list_jobs(NextToken=response["NextToken"])
                result.extend(response["JobNames"])
    
            return [e for e in result if "jobs_xyz" in e]
    
    
        #WHAT IS CURRENTLY
        def job_status(self, job_name):
             paginator = self.glue_client.get_paginator('get_job_runs')
             response = paginator.paginate(JobName=job_name)
             return response
    
        def jobs_details(self, jobs):
             return [self.job_status(e) for e in jobs]
    
        #WHAT IS EXPECTED
        def pass_by_list_comprehension(func):
            def inner(list_of_val):
                return [func(value) for value in list_of_val ]
            return inner
    
        @pass_by_list_comprehension
        def job_status(self, job_name):
            paginator = self.glue_client.get_paginator('get_job_runs')
            response = paginator.paginate(JobName=job_name)
            return response
    
    glue_client = GlueClient()
    jobs = glue_client.jobs_list()
    jobs_status = glue_client.job_status(jobs)
    print(jobs)
    
    2 回复  |  直到 3 年前
        1
  •  2
  •   juanpa.arrivillaga    3 年前

    你想要这样的东西:

    import boto3
    from typing import Callable
    
    
    def handle_iterable_input(func):
        def inner(self, list_of_val):
            return [func(self, value) for value in list_of_val]
        return inner
    
    class GlueClient:
    
        def __init__(self):
            self.glue_client = boto3.client('glue')
            #self.envs = envs
    
        def jobs_list(self):
            response = self.glue_client.list_jobs()
            result = response["JobNames"]
    
            while "NextToken" in response:
                response = self.glue_client.list_jobs(NextToken=response["NextToken"])
                result.extend(response["JobNames"])
    
            return [e for e in result if "jobs_xyz" in e]
    
        @handle_iterable_input
        def job_status(self, job_name):
            paginator = self.glue_client.get_paginator('get_job_runs')
            response = paginator.paginate(JobName=job_name)
            return response
    
    glue_client = GlueClient()
    jobs = glue_client.jobs_list()
    jobs_status = glue_client.job_status(jobs)
    print(jobs)
    

    这是使装饰器正确处理方法的最基本方法,通过显式处理 self 。注意,它假设被修饰的函数只接受一个参数。

        2
  •  1
  •   CrazyChucky    3 年前

    如果你只想做 job_status 遍历作业名称列表,而不是只对一个作业名称进行操作,这样的操作应该有效:

    def jobs_status(self, job_names):
        paginator = self.glue_client.get_paginator('get_job_runs')
        return [paginator.paginate(JobName=job_name) for job_name in job_names]
    

    使用decorator来更改方法所期望的参数似乎是个坏主意。

    此外,命名您的类 GlueClient 意味着 胶水客户。事实上 名为的属性 glue_client 让我怀疑你可能会为其中一个或两个选择一个更清晰的名字。(不过,我不熟悉您使用的软件包。)