如何解决单独文件中的FastAPI / Pydantic循环引用
我很想在FastAPI中使用类似于以下内容的模式:
from __future__ import annotations
from typing import List
from pydantic import BaseModel
class Project(BaseModel):
members: List[User]
class User(BaseModel):
projects: List[Project]
Project.update_forward_refs()
但是为了保持我的项目结构整洁,我会这样做。喜欢在单独的文件中定义它们。我该如何做而不创建循环引用?
使用FastAPI中的架构生成上面的代码可以正常工作,我只是不知道如何将其分离到单独的文件中。然后,在随后的步骤中,我将使用@property
而不是使用属性来定义这些对象的子类中的这些对象的吸气剂。但是对于OpenAPI文档生成,我需要结合使用-我认为。
解决方法
在以下三种情况下,循环依赖关系可能在Python中起作用:
- 模块顶部:
# Use ImageDataGenerator to create 3 lots of batches train_batches = ImageDataGenerator( rescale=1/255).flow_from_directory(directory=train_path,target_size=(80,80),classes=['cn','ad'],batch_size=100,color_mode="rgb") valid_batches = ImageDataGenerator( rescale=1/255).flow_from_directory(directory=valid_path,color_mode="rgb") # test_batches = ImageDataGenerator( # rescale=1/255).flow_from_directory(directory=test_path,# target_size=(224,224),batch_size=10,# color_mode="rgb") imgs,labels = next(train_batches) # Test to see normalisation has occurred properly print(imgs[1][8]) # Define method to plot MRIs def plotImages(images_arr): fig,axes = plt.subplots(1,10,figsize=(20,20)) axes = axes.flatten() for img,ax in zip( images_arr,axes): ax.imshow(img) ax.axis('off') plt.tight_layout() plt.show() # Plot a sample of MRIs plotImages(imgs) # # Define the model # # VGG16 # model = Sequential() # model.add(Conv2D(input_shape=(160,160,3),filters=64,kernel_size=(3,padding="same",activation="relu")) # model.add(Conv2D(filters=64,activation="relu")) # model.add(MaxPool2D(pool_size=(2,2),strides=(2,2))) # model.add(Conv2D(filters=128,activation="relu")) # model.add(Conv2D(filters=128,2))) # model.add(Conv2D(filters=256,activation="relu")) # model.add(Conv2D(filters=256,2))) # model.add(Conv2D(filters=512,activation="relu")) # model.add(Conv2D(filters=512,2))) # model.add(Flatten()) # model.add(Dense(units=1024,activation="relu")) # model.add(Dense(units=128,activation="relu")) # model.add(Dense(units=2,activation="softmax")) # # Model from the paper # model = Sequential([ # Conv2D(filters=32,activation='relu',padding = 'same',input_shape=(160,3)),# Conv2D(filters=32,padding='same'),# MaxPool2D(pool_size=(2,strides=2),# Flatten(),# Dense(units=2,activation='softmax') # ]) ## Model from Dr Paul # static_conv_layer=Conv2D(filters=16,kernel_size=(5,5),padding = 'same') # # model = Sequential([ # Conv2D(filters=16,input_shape=(32,32,# Dropout(0.1),# static_conv_layer,activation='softmax') # ]) # This model hits around 75% train acc,54% val acc model = Sequential([ Conv2D(filters=16,input_shape=(80,80,MaxPool2D(pool_size=(2,# Dropout(0.1),# Conv2D(filters=16,# MaxPool2D(pool_size=(2,Flatten(),Dense(units=2,activation='softmax') ]) # model = Sequential([ # Conv2D(filters=32,activation='softmax') # ]) ## Basic model with dropouts # model = Sequential([ # Conv2D(filters=32,input_shape=(224,224,# Conv2D(filters=64,# Dropout(0.2),# Conv2D(filters=128,# Dropout(0.3),# Dense(units=1,activation='sigmoid') # ]) # Summarise each layer of the model print(model.summary()) # Compile and train the model model.compile(optimizer=Adam(),loss='binary_crossentropy',metrics=['accuracy']) model.fit(x=train_batches,steps_per_epoch=len(train_batches),validation_data=valid_batches,validation_steps=len(valid_batches),epochs=20,verbose=1 )
- 模块底部:
import package.module
- 功能顶层:可同时使用
根据您的情况,第二种情况“模块底部”会有所帮助。
因为您使用need to use from package.module import attribute
函数来解决像这样的pydantic推迟的注释:
update_forward_refs
# project.py
from typing import List
from pydantic import BaseModel
class Project(BaseModel):
members: "List[User]"
from user import User
Project.update_forward_refs()
不过,我强烈劝阻您不要故意引入循环依赖项
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。