# หลีกเลี่ยงการเขียน Top level Python Code ใน Airflow DAG

**URL:** <https://discuss.dataengineercafe.io/t/top-level-python-code-airflow-dag/431>\
**Category:** Airflow\
**Tags:** airflow, python, practice\
**Created:** [October 8, 2022, 2:23am UTC](https://discuss.dataengineercafe.io/t/top-level-python-code-airflow-dag/431 "2022-10-08T02:23:14Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![zkan](https://yyz1.discourse-cdn.com/flex035/user_avatar/discuss.dataengineercafe.io/zkan/32/2_2.png) [@zkan](https://discuss.dataengineercafe.io/u/zkan)\
**Post date:** [October 8, 2022, 2:23am UTC](https://discuss.dataengineercafe.io/t/top-level-python-code-airflow-dag/431/1 "2022-10-08T02:23:15Z")

</div>

Practice หนึ่งใน Airflow คือการหลีกเลี่ยงการเขียน Top level Python Code ใน DAG เป็นเพราะเนื่องจากการทำงานของ scheduler ที่จะคอยมา parse ไฟล์ DAG ของเราอยู่เรื่อย ๆ ดังนั้นถ้าเรามี code อะไรก็ตามที่อยู่ข้างนอก task หรือ function แล้ว ตอนที่ scheduler เข้ามา parse ไฟล์ มันก็จะ execute โค้ดนั้น ๆ ด้วย

ยกตัวอย่างง่าย ๆ ถ้าเรามีโค้ด DAG ประมาณนี้

```python
conn = psycopg2.connect(
    database="db_name",
    host="db_host",
    user="db_user",
    password="db_pass",
    port="db_port",
)

with DAG( ... ):
    execute_something = PythonOperator( ... )

```

จะเกิดการ connect เข้าไปยัง Postgres database ทุกรอบที่ scheduler มาอ่านไฟล์ ซึ่งทำให้ performance ของ Airflow เราลดลงได้ ซ้ำยังมีปัญหาเรื่องการยิง connection เข้าไปที่ database อีก 😅

ดังนั้นตรงนี้เราควรที่จะเอาไปเขียนใน function แล้วให้ operator อย่าง `PythonOperator` มาเรียก function นั้นแทน

แล้วก็เรื่อง import ก็เช่นกัน ตรงนี้น่าจะขัดใจ Python developer อยู่พอสมควร ตามรูปด้านล่างนี้

 ![Avoid importing a module outside Airflow task](https://canada1.discourse-cdn.com/flex035/uploads/dataengineercafe/original/1X/889d57801b73252476e236d3a8d9ade00dc46147.png)

เพราะว่าการ import ที่ top level ทำให้เกิดโหลดขึ้นเยอะพอสมควร เค้าเลยแนะนำให้ไป import แบบ local หรือ import ใน function แทน

ตรงนี้ก็ trade-off กันไปครับ ขัดใจกันไปบ้าง ฮ่า ๆ อย่างไรก็ดี การที่เราเข้าใจการทำงานของเครื่องมือนั้นมากขึ้น และเข้าใจข้อดีข้อเสีย มันก็จะทำให้เราใช้เครื่องมือนั้น ๆ ได้ดีขึ้นด้วย และการเขียนโค้ด การออกแบบระบบของเราในอนาคต เราก็สามารถหยิบตรงนี้มาพูดคุยแลกเปลี่ยนความคิดเห็นกันได้ 😊

**Reference:** [Top level Python Code](https://airflow.apache.org/docs/apache-airflow/stable/best-practices.html#top-level-python-code)
