@@ -251,6 +251,17 @@ def init_values(self) -> None:
251251 if name in self .values :
252252 self .__dict__ [name ] = config [name ]
253253
254+ def post_init_values (self ) -> None :
255+ """
256+ Initialize additional config variables that are added after init_values() called.
257+ """
258+ config = self ._raw_config
259+ for name in config :
260+ if name not in self .__dict__ and name in self .values :
261+ self .__dict__ [name ] = config [name ]
262+
263+ check_confval_types (None , self )
264+
254265 def __getattr__ (self , name : str ) -> Any :
255266 if name .startswith ('_' ):
256267 raise AttributeError (name )
@@ -427,7 +438,7 @@ def check_confval_types(app: "Sphinx", config: Config) -> None:
427438 "but `{current}` is given." )
428439 logger .warning (msg .format (name = confval .name ,
429440 current = confval .value ,
430- candidates = annotations .candidates ))
441+ candidates = annotations .candidates ), once = True )
431442 else :
432443 if type (confval .value ) is type (default ):
433444 continue
@@ -452,13 +463,13 @@ def check_confval_types(app: "Sphinx", config: Config) -> None:
452463 permitted = " or " .join (wrapped_annotations )
453464 logger .warning (msg .format (name = confval .name ,
454465 current = type (confval .value ),
455- permitted = permitted ))
466+ permitted = permitted ), once = True )
456467 else :
457468 msg = __ ("The config value `{name}' has type `{current.__name__}', "
458469 "defaults to `{default.__name__}'." )
459470 logger .warning (msg .format (name = confval .name ,
460471 current = type (confval .value ),
461- default = type (default )))
472+ default = type (default )), once = True )
462473
463474
464475def check_primary_domain (app : "Sphinx" , config : Config ) -> None :
0 commit comments