我正在构建一个包含大量命令的Typer应用程序。我想将命令分类到子文件中,但不确定如何解决依赖关系。
|
├── melvil
│ ├── add.json
│ ├── book
│ │ ├── book.py
│ │ └── __init__.py
│ ├── booklist
│ │ ├── booklist.py
│ │ └── __init__.py
│ ├── helper
│ │ ├── helper.py
│ │ └──__init__.py
│ ├── search
│ │ ├── __init__.py
│ │ └── search.py
│ │
│ │
│ ├── __init__.py
│ ├── main.py
│ ├── setup.py
│ └── test_input.txt
main.py
是父级。它看起来像这样:
import typer
from datetime import date
app = typer.Typer()
# Import submodules
from booklist.booklist import *
from book.book import *
from search.search import *
from helper.helper import *
# App is only invoked when we run main.py directly, but not when we import it.
if __name__ == "__main__":
app()
因此,我们制作了一个新的Typerapp
,并从子模块导入所有内容。很简单。
每个子模块都包含Typer命令,如booklist
:
# This file focuses on commands that affect the entire booklist.
import inquirer
import os
import json
import csv
@app.command()
def delete():
"""
...Irrelevant code here...
"""
问题是:为了使用@app.command()
装饰器定义Typer命令,每个子模块首先需要从父main.py
导入app
。然而,main.py
在任何子模块的import语句中运行,因此当main.py
导入它所在的任何子模块时,都会出现循环导入。
应该如何构建这个项目,使所有子模块都可以访问app
,main.py
也可以访问所有子模块?
您可以在app
自己的单独模块中初始化它。让子模块从那里导入它,并让main
模块导入这些子模块。
类似于以下内容:app.py
import typer
app = typer.Typer()
booklist.py
from YOURTOPLEVELPACKAGE.app import app
@app.command()
def your_function():
...
main.py
# All of those include `app`
from booklist.booklist import *
from book.book import *
from search.search import *
from helper.helper import *
if __name__ == "__main__":
app()