使用pydantic-to-typescript生成TS接口时遇AttributeError问题求助
解决pydantic-to-typescript生成TypeScript接口的报错问题
使用pydantic-to-typescript工具从Python类生成TypeScript接口时,先后遇到两个报错:
- 用pydantic dataclass定义类时,执行命令
pydantic2ts --module ./model/client.py --output client.ts出现AttributeError: Config - 改用BaseModel定义后,出现
AttributeError: __concrete__
已全局安装json-schema-to-typescript依赖,相关代码及错误信息如下:
原dataclass代码及错误
代码
from pydantic.dataclasses import dataclass @dataclass class Client: clientId: str clientName: str
错误信息
C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Lib\site-packages\pydantic\_migration.py:283: UserWarning: `pydantic.generics:GenericModel` has been moved to `pydantic.BaseModel`. warnings.warn(f'`{import_path}` has been moved to `{new_location}`.') 2023-12-29 03:41:03,954 Finding pydantic models... 2023-12-29 03:41:04,034 Generating JSON schema from pydantic models... Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Scripts\pydantic2ts.exe\__main__.py", line 7, in <module> File "C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Lib\site-packages\pydantic2ts\cli\script.py", line 274, in main return generate_typescript_defs( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Lib\site-packages\pydantic2ts\cli\script.py", line 208, in generate_typescript_defs schema = generate_json_schema(models) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Lib\site-packages\pydantic2ts\cli\script.py", line 165, in generate_json_schema master_model.Config.extra = Extra.forbid ^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Lib\site-packages\pydantic\_internal\_model_construction.py", line 215, in __getattr__ raise AttributeError(item) AttributeError: Config
改用BaseModel后的代码及错误
代码
from pydantic import BaseModel class Client(BaseModel): clientId: str clientName: str
错误信息
C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Lib\site-packages\pydantic\_migration.py:283: UserWarning: `pydantic.generics:GenericModel` has been moved to `pydantic.BaseModel`. warnings.warn(f'`{import_path}` has been moved to `{new_location}`.') 2023-12-29 03:42:23,101 Finding pydantic models... Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Scripts\pydantic2ts.exe\__main__.py", line 7, in <module> File "C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Lib\site-packages\pydantic2ts\cli\script.py", line 274, in main return generate_typescript_defs( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Lib\site-packages\pydantic2ts\cli\script.py", line 201, in generate_typescript_defs models = extract_pydantic_models(import_module(module)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Lib\site-packages\pydantic2ts\cli\script.py", line 81, in extract_pydantic_models for _, model in inspect.getmembers(module, is_concrete_pydantic_model): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\inspect.py", line 607, in getmembers return _getmembers(object, predicate, getattr) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\inspect.py", line 598, in _getmembers if not predicate or predicate(value): ^^^^^^^^^^^^^^^^ File "C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Lib\site-packages\pydantic2ts\cli\script.py", line 69, in is_concrete_pydantic_model return bool(obj.__concrete__) ^^^^^^^^^^^^^^^^ File "C:\Users\user\.virtualenvs\pdf-creator-HARGFuzC\Lib\site-packages\pydantic\_internal\_model_construction.py", line 215, in __getattr__ raise AttributeError(item) AttributeError: __concrete__
解决方案
原因分析
当前pydantic-to-typescript工具的官方版本未适配Pydantic v2,Pydantic v2重构了内部实现,移除了__concrete__属性,同时Config类的访问方式也发生了变化,导致工具调用失败。
解决方式
方式1:降级到Pydantic v1.x
卸载当前Pydantic版本,安装兼容的v1版本:
pip uninstall -y pydantic pip install pydantic==1.10.13
之后重新运行pydantic2ts命令即可正常生成TypeScript接口。
方式2:使用支持Pydantic v2的替代工具
推荐使用datamodel-code-generator,该工具支持Pydantic v2,安装及使用命令如下:
pip install datamodel-code-generator datamodel-codegen --input ./model/client.py --output client.ts
内容的提问来源于stack exchange,提问作者Dimitris Kremezis
相关产品推荐
相关产品推荐

