@@ -80,7 +80,7 @@ def is_staticmethod(attr) -> bool:
8080
8181
8282def is_method (attr ) -> bool :
83- return inspect .isfunction (attr ) and not is_staticmethod (attr )
83+ return ( inspect .isfunction (attr ) or attr . __class__ . __name__ == 'cython_function_or_method' ) and not is_staticmethod (attr )
8484
8585
8686def is_property (attr ) -> bool :
@@ -265,10 +265,7 @@ def get_signature_parameters_and_indexes(component, parent, logger):
265265 params = params [1 :]
266266 args_idx = get_arg_kind_index (params , kinds .VAR_POSITIONAL )
267267 kwargs_idx = get_arg_kind_index (params , kinds .VAR_KEYWORD )
268- doc_params = {}
269- for doc in parse_docs (component , parent , logger ):
270- for param in doc .params :
271- doc_params [param .arg_name ] = param .description
268+ doc_params = parse_docs (component , parent , logger )
272269 for num , param in enumerate (params ):
273270 params [num ] = ParamData (
274271 doc = doc_params .get (param .name ),
@@ -767,6 +764,37 @@ def get_parameters_by_assumptions(
767764 return params
768765
769766
767+ def get_parameters_from_pydantic (
768+ function_or_class : Union [Callable , Type ],
769+ method_or_property : Optional [str ],
770+ logger : logging .Logger ,
771+ ) -> Optional [ParamList ]:
772+ from .optionals import import_pydantic , pydantic_support
773+ if not pydantic_support or method_or_property :
774+ return None
775+ pydantic = import_pydantic ('get_parameters_from_pydantic' )
776+ if not is_subclass (function_or_class , pydantic .BaseModel ):
777+ return None
778+ params = []
779+ doc_params = parse_docs (function_or_class , None , logger )
780+ for field in function_or_class .__fields__ .values (): # type: ignore
781+ if field .required :
782+ default = inspect ._empty
783+ elif field .default_factory :
784+ default = field .default_factory ()
785+ else :
786+ default = field .default
787+ params .append (ParamData (
788+ name = field .name ,
789+ annotation = field .annotation ,
790+ default = default ,
791+ kind = kinds .KEYWORD_ONLY ,
792+ doc = field .field_info .description or doc_params .get (field .name ),
793+ component = function_or_class ,
794+ ))
795+ return params
796+
797+
770798def get_signature_parameters (
771799 function_or_class : Union [Callable , Type ],
772800 method_or_property : Optional [str ] = None ,
@@ -787,6 +815,9 @@ def get_signature_parameters(
787815 """
788816 logger = parse_logger (logger , 'get_signature_parameters' )
789817 try :
818+ params = get_parameters_from_pydantic (function_or_class , method_or_property , logger )
819+ if params is not None :
820+ return params
790821 visitor = ParametersVisitor (function_or_class , method_or_property , logger = logger )
791822 return visitor .get_parameters ()
792823 except Exception as ex :
0 commit comments