气流Python操作员返回类型

时间:2019-02-15 01:47:43

标签: python airflow

我的DAG中有一个python运算符。 python可调用函数返回布尔值。但是,当我运行DAG时,出现以下错误。

  

TypeError:“布尔”对象不可调用

我修改了该函数以使其不返回任何内容,但是再次出现以下错误

  

错误-'NoneType'对象不可调用

下面是我的爸爸

def check_poke(threshold,sleep_interval):
flag=snowflake_poke(1000,10).poke()
#print(flag)
return flag

dependency = PythonOperator(
task_id='poke_check',
#python_callable=check_poke(129600,600),
provide_context=True,
python_callable=check_poke(129600,600),
dag=dag)

end = BatchEndOperator(
queue=QUEUE,
dag=dag)

start.set_downstream(dependency)
dependency.set_downstream(end)

无法弄清我想念的是什么。有人可以帮我这个忙...气流的新手。

我在dag中编辑了python运算符,如下所示

dependency = PythonOperator(
task_id='poke_check',
provide_context=True,
python_callable=check_poke(129600,600),
dag=dag)

但是现在,我得到了另一个错误。

Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/airflow/models.py", line 1245, in run
    result = task_copy.execute(context=context)
File "/usr/local/lib/python2.7/dist-packages/airflow/operators/python_operator.py", line 66, in execute
    return_value = self.python_callable(*self.op_args, **self.op_kwargs)
TypeError: () takes no arguments (25 given)
[2019-02-15 05:30:25,375] {models.py:1298} INFO - Marking task as UP_FOR_RETRY
[2019-02-15 05:30:25,393] {models.py:1327} ERROR - () takes no arguments (25 given)

2 个答案:

答案 0 :(得分:1)

自变量名称将其放弃。您传递的是呼叫而不是可通话的结果。

python_callable=check_poke(129600,600)

第二个错误指​​出可调用对象使用25个参数进行调用。因此lambda:无法正常工作。可以执行以下操作,但是忽略25个参数确实值得怀疑。

python_callable=lambda *args, **kwargs: check_poke(129600,600)

答案 1 :(得分:0)

同意 @Dan D。。但令人困惑的是他的解决方案不起作用的原因(它肯定在python shell 中起作用)

看看是否能找到运气(只是 @Dan D。解决方案的冗长变体)

from typing import Callable

# your original check_poke function
def check_poke(arg_1: int, arg_2: int) -> bool:
    # do something
    # somehow returns a bool
    return arg_1 < arg_2

# a function that returns a callable, that in turn invokes check_poke
# with the supplied params
def check_poke_wrapper_creator(arg_1: int, arg_2: int) -> Callable[[], bool]:
    def check_poke_wrapper() -> bool:
        return check_poke(arg_1=arg_1, arg_2=arg_2)

    return check_poke_wrapper

..

# usage
python_callable=check_poke_wrapper_creator(129600, 600)