Python 3.x 气流2.0-属性错误:';MyOperator';对象没有属性';kwargs';
我正在尝试为Airflow 2.0编写一个自定义操作符,但我似乎无法理解为什么操作符无法识别Python 3.x 气流2.0-属性错误:';MyOperator';对象没有属性';kwargs';,python-3.x,airflow,Python 3.x,Airflow,我正在尝试为Airflow 2.0编写一个自定义操作符,但我似乎无法理解为什么操作符无法识别kwargs参数 这是我的自定义操作员文件 from airflow.models.baseoperator import BaseOperator from airflow.utils.decorators import apply_defaults class MyOperator(BaseOperator): @apply_defaults def __init__(self,
kwargs
参数
这是我的自定义操作员文件
from airflow.models.baseoperator import BaseOperator
from airflow.utils.decorators import apply_defaults
class MyOperator(BaseOperator):
@apply_defaults
def __init__(self,
name,
*args,
**kwargs):
super(MyOperator, self).__init__(*args, **kwargs)
self.name = name
def execute(self, context):
return self.kwargs
这是我的dag:
from datetime import timedelta
from airflow import DAG
from airflow.utils.dates import days_ago
from operators.custom import MyOperator
args = {
'owner': 'airflow',
}
with DAG(
dag_id='ex_operator',
default_args=args,
schedule_interval='0 0 * * *',
start_date=days_ago(1),
dagrun_timeout=timedelta(minutes=60)
) as dag:
custom_ops = MyOperator(
task_id = 'myop_id',
name = 'me',
params = {
'lib': 'rainy'
}
)
当我运行此命令时,会出现以下错误:
Traceback (most recent call last):
File "/home/airflow/.local/lib/python3.8/site-packages/airflow/models/taskinstance.py", line 1086, in _run_raw_task
self._prepare_and_execute_task_with_callbacks(context, task)
File "/home/airflow/.local/lib/python3.8/site-packages/airflow/models/taskinstance.py", line 1260, in _prepare_and_execute_task_with_callbacks
result = self._execute_task(context, task_copy)
File "/home/airflow/.local/lib/python3.8/site-packages/airflow/models/taskinstance.py", line 1300, in _execute_task
result = task_copy.execute(context=context)
File "/home/airflow/plugins/operators/custom.py", line 33, in execute
return self.kwargs
AttributeError: 'MyOperator' object has no attribute 'kwargs'
有什么我做错了吗?为什么这不能识别在任何普通Python类中都可以识别的kwargs呢?
args
和kwargs
没有被分配,而超类也没有这样做。这把它修好了
class MyOperator(BaseOperator):
@apply_defaults
def __init__(self,
name,
*args,
**kwargs):
super(MyOperator, self).__init__(*args, **kwargs)
self.name = name
self.args = args
self.kwargs = kwargs
更新:在BaseOperator
超类中,我看到了以下内容:
super().__init__()
if kwargs:
if not conf.getboolean('operators', 'ALLOW_ILLEGAL_ARGUMENTS'):
raise AirflowException(
"Invalid arguments were passed to {c} (task_id: {t}). Invalid "
"arguments were:\n**kwargs: {k}".format(c=self.__class__.__name__, k=kwargs, t=task_id),
)
warnings.warn(
'Invalid arguments were passed to {c} (task_id: {t}). '
'Support for passing such arguments will be dropped in '
'future. Invalid arguments were:'
'\n**kwargs: {k}'.format(c=self.__class__.__name__, k=kwargs, t=task_id),
category=PendingDeprecationWarning,
stacklevel=3,
)
此时,您必须将
aiffort.cfg
文件中的allow_非法参数设置为true
,才能将其他/未使用的参数传递给BaseOperator。不过,Airflow似乎计划在将来不再使用它。我看不到任何地方分配了self.kwargs。超级类应该这样做吗?我使用的超类来自这里:我觉得超级类在这样做,但我猜我错了。我丢失了self.args=args
和self.kwargs=kwargs
。我在跟踪其他自定义操作符,但他们没有分配-我猜Airflow 2.0将BaseOperator类更改为不分配args
和kwargs
。谢谢@illrnr101您需要在execute
中访问哪些尚未分配的参数?您正在自定义初始化中分配name
,并且params
或task\u id
已分配给super类中的self
。因此,您可以使用self.task_id
或self.params
访问execute
中的每个kwargs,而不使用self.kwargs
?这与答案无关,但我只是好奇。你是对的@Emma。我也可以这样做。如果我不想使用关键字params
,我是否可以将dag定义中的params
更改为keyword
,并且超级类仍然可以识别它?