Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当python_可调用对象被修饰时,在airflow中显示底层代码_Python_Airflow_Python Decorators - Fatal编程技术网

当python_可调用对象被修饰时,在airflow中显示底层代码

当python_可调用对象被修饰时,在airflow中显示底层代码,python,airflow,python-decorators,Python,Airflow,Python Decorators,我在日常工作中使用气流。我的大多数任务都以当前日期为参数 为了避免我的所有任务都从上下文中提取日期并对其进行解析(这是一个非常复杂的问题),我引入了一个包装器/装饰器 def task_abc(日期:datetime.date): 打印(日期strftime(“%Y-%m-%d”)) def wrap_任务(任务): def wrapped_任务(**上下文): 任务(datetime.date.fromisoformat(上下文['ds'])) 返回包装的任务 包装作业=包装作业(作业作业作业

我在日常工作中使用气流。我的大多数任务都以当前日期为参数

为了避免我的所有任务都从上下文中提取日期并对其进行解析(这是一个非常复杂的问题),我引入了一个包装器/装饰器

def task_abc(日期:datetime.date):
打印(日期strftime(“%Y-%m-%d”))
def wrap_任务(任务):
def wrapped_任务(**上下文):
任务(datetime.date.fromisoformat(上下文['ds']))
返回包装的任务
包装作业=包装作业(作业作业作业)
美国广播公司(ds='2020-10-11')
以xxx作为dag:
my_dag_task=PythonOperator(task_id='task_abc',provide_context=True,python_callable=wrapped_abc)
它就像一个符咒,除了在web UI中,
python\u callable
显示的是锅炉板(
wrapped\u task
),而不是正在调用的实际代码


有没有办法避免这种情况?

将修饰函数的源代码指向原始源代码是Python中的一个常见问题,可以使用
functools

import datetime
import functools
import inspect


def task_abc(date: datetime.date):
    print(date.strftime('%Y-%m-%d'))


def wrap_task(task):
    def wrapped_task(**context):
        task(datetime.date.fromisoformat(context['ds']))
    return wrapped_task


def wrap_task_with_source(task):
    def wrapped_task(**context):
        task(datetime.date.fromisoformat(context['ds']))
    return functools.update_wrapper(wrapped_task, task)


wrapped_abc = wrap_task(task_abc)
wrapped_abc_with_source = wrap_task_with_source(task_abc)

print('without source:')
print(inspect.getsource(wrapped_abc))
print('with source:')
print(inspect.getsource(wrapped_abc_with_source))

wrapped_abc(ds='2020-10-11')
wrapped_abc_with_source(ds='2020-10-11')
将打印:

without source:
    def wrapped_task(**context):
        task(datetime.date.fromisoformat(context['ds']))

with source:
def task_abc(date: datetime.date):
    print(date.strftime('%Y-%m-%d'))

2020-10-11
2020-10-11

一个重要的警告是,当使用partial时,请参见将修饰函数的源代码指向原始源代码是Python中的一个常见问题,可以使用
functools

import datetime
import functools
import inspect


def task_abc(date: datetime.date):
    print(date.strftime('%Y-%m-%d'))


def wrap_task(task):
    def wrapped_task(**context):
        task(datetime.date.fromisoformat(context['ds']))
    return wrapped_task


def wrap_task_with_source(task):
    def wrapped_task(**context):
        task(datetime.date.fromisoformat(context['ds']))
    return functools.update_wrapper(wrapped_task, task)


wrapped_abc = wrap_task(task_abc)
wrapped_abc_with_source = wrap_task_with_source(task_abc)

print('without source:')
print(inspect.getsource(wrapped_abc))
print('with source:')
print(inspect.getsource(wrapped_abc_with_source))

wrapped_abc(ds='2020-10-11')
wrapped_abc_with_source(ds='2020-10-11')
将打印:

without source:
    def wrapped_task(**context):
        task(datetime.date.fromisoformat(context['ds']))

with source:
def task_abc(date: datetime.date):
    print(date.strftime('%Y-%m-%d'))

2020-10-11
2020-10-11
一个重要的注意事项是,在使用partial时,请参见