@@ -79,8 +79,6 @@ class Documenter:
7979 #: name by which the directive is called (auto...) and the default
8080 #: generated directive name
8181 objtype : ClassVar = 'object'
82- #: order if autodoc_member_order is set to 'groupwise'
83- member_order : ClassVar = 0
8482 #: true if the generated content may contain titles
8583 titles_allowed : ClassVar = True
8684
@@ -174,14 +172,6 @@ def _load_object_by_name(self) -> Literal[True] | None:
174172 self .parent = parent
175173 self .object_name = props .object_name
176174 self .object = props ._obj
177- if self .objtype == 'method' :
178- if 'staticmethod' in props .properties : # type: ignore[attr-defined]
179- # document static members before regular methods
180- self .member_order -= 1 # type: ignore[misc]
181- elif 'classmethod' in props .properties : # type: ignore[attr-defined]
182- # document class methods before static methods as
183- # they usually behave as alternative constructors
184- self .member_order -= 2 # type: ignore[misc]
185175 self ._load_object_has_been_called = True
186176 return True
187177
@@ -497,7 +487,39 @@ def sort_members(
497487 """Sort the given member list."""
498488 if order == 'groupwise' :
499489 # sort by group; alphabetically within groups
500- documenters .sort (key = lambda e : (e [0 ].member_order , e [0 ].name ))
490+
491+ def key_func (entry : tuple [Documenter , bool ]) -> tuple [int , str ]:
492+ documenter , _ = entry
493+ props = documenter .props
494+
495+ if props .obj_type == 'exception' :
496+ group_key = 10
497+ elif props .obj_type == 'class' :
498+ group_key = 20
499+ elif props .obj_type in {'function' , 'decorator' }:
500+ group_key = 30
501+ elif props .obj_type == 'data' :
502+ group_key = 40
503+ elif props .obj_type == 'method' :
504+ if props .is_classmethod : # type: ignore[attr-defined]
505+ # document class methods before static methods as
506+ # they usually behave as alternative constructors
507+ group_key = 48
508+ elif props .is_staticmethod : # type: ignore[attr-defined]
509+ # document static members before regular methods
510+ group_key = 49
511+ else :
512+ group_key = 50
513+ elif props .obj_type in {'attribute' , 'property' }:
514+ group_key = 60
515+ elif props .obj_type == 'type' :
516+ group_key = 70
517+ else :
518+ group_key = 0
519+
520+ return group_key , documenter .name
521+
522+ documenters .sort (key = key_func )
501523 elif order == 'bysource' :
502524 if (
503525 isinstance (self , ModuleDocumenter )
@@ -780,7 +802,6 @@ class FunctionDocumenter(Documenter):
780802 props : _FunctionDefProperties
781803
782804 objtype = 'function'
783- member_order = 30
784805
785806
786807class DecoratorDocumenter (FunctionDocumenter ):
@@ -797,7 +818,6 @@ class ClassDocumenter(Documenter):
797818 props : _ClassDefProperties
798819
799820 objtype = 'class'
800- member_order = 20
801821 option_spec : ClassVar [OptionSpec ] = {
802822 'members' : members_option ,
803823 'undoc-members' : bool_option ,
@@ -836,7 +856,6 @@ class ExceptionDocumenter(ClassDocumenter):
836856 props : _ClassDefProperties
837857
838858 objtype = 'exception'
839- member_order = 10
840859
841860
842861class DataDocumenter (Documenter ):
@@ -847,7 +866,6 @@ class DataDocumenter(Documenter):
847866 __uninitialized_global_variable__ = True
848867
849868 objtype = 'data'
850- member_order = 40
851869 option_spec : ClassVar [OptionSpec ] = dict (Documenter .option_spec )
852870 option_spec ['annotation' ] = annotation_option
853871 option_spec ['no-value' ] = bool_option
@@ -860,7 +878,6 @@ class MethodDocumenter(Documenter):
860878
861879 objtype = 'method'
862880 directivetype = 'method'
863- member_order = 50
864881
865882
866883class AttributeDocumenter (Documenter ):
@@ -869,7 +886,6 @@ class AttributeDocumenter(Documenter):
869886 props : _AssignStatementProperties
870887
871888 objtype = 'attribute'
872- member_order = 60
873889 option_spec : ClassVar [OptionSpec ] = dict (Documenter .option_spec )
874890 option_spec ['annotation' ] = annotation_option
875891 option_spec ['no-value' ] = bool_option
@@ -887,7 +903,6 @@ class PropertyDocumenter(Documenter):
887903 props : _FunctionDefProperties
888904
889905 objtype = 'property'
890- member_order = 60
891906
892907
893908class TypeAliasDocumenter (Documenter ):
@@ -896,7 +911,6 @@ class TypeAliasDocumenter(Documenter):
896911 props : _TypeStatementProperties
897912
898913 objtype = 'type'
899- member_order = 70
900914 option_spec : ClassVar [OptionSpec ] = {
901915 'no-index' : bool_option ,
902916 'no-index-entry' : bool_option ,
0 commit comments