如何解决主脚本和需要从脚本访问全局变量的子模块之间的相互依赖关系



我正在构建一个包含大量命令的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导入它所在的任何子模块时,都会出现循环导入。

应该如何构建这个项目,使所有子模块都可以访问appmain.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()

最新更新