Docutils运行时设置¶
- Author
David Goodger
- Contact
- Date
$Date: 2012-01-03 20:23:53 +0100 (Di, 03. J盲n 2012) $
- Revision
$Revision: 7302 $
- Copyright
This document has been placed in the public domain.
目录
Introduction¶
Docutils runtime settings are assembled from several sources: component settings specifications, application settings specifications, configuration files, and command-line options. Docutils overlays default and explicitly specified values from these sources such that settings behave the way we want and expect them to behave.
To understand how Docutils deals with runtime settings, the attributes
and parameters involved must first be understood. Begin with the the
docstrings of the attributes of the docutils.SettingsSpec
base
class (in the docutils/__init__.py
module):
settings_spec
settings_defaults
settings_default_overrides
relative_path_settings
config_section
config_section_dependencies
Next, several convenience function parameters are also significant
(described in the docutils.core.publish_programmatically
function
docstring):
The
settings
parameter is a runtime settings (docutils.frontend.Values
) object which, if present, is assumed to be complete (it must include all runtime settings). Also, if thesettings
parameter is present, no further runtime settings processing is done. In other words, the other parameters, described below, will have no effect.settings_spec
, a docutils.SettingsSpec subclass or object, is treated like a fourth component (after the Parser, Reader, and Writer). In other words, it’s the settings specification for the “Application” itself.settings_overrides
is a dictionary which will override the defaults of the components (from their settings specs).config_section
specifies the name of an application-specific configuration file section.
Runtime Settings Processing for Command-Line Tools¶
Following along with the actual code is recommended. The
docutils/__init__.py
, docutils/core.py
, and
docutils.frontend.py
modules are described.
A command-line front-end tool imports and calls
docutils.core.publish_cmdline
. The relevant convenience function parameters are described above.docutils.core.publish_cmdline
initializes adocutils.core.Publisher
object, then calls itspublish
method.The
docutils.core.Publisher
object’spublish
method checks itssettings
attribute to see if it’s defined. If it is, no further runtime settings processing is done.If
settings
is not defined,self.process_command_line
is called with the following relevant arguments:settings_spec
config_section
settings_overrides
(in the form of excess keyword arguments, collected in thedefaults
parameter)
self.process_command_line
callsself.setup_option_parser
, passingsettings_spec
,config_section
, anddefaults
.self.setup_option_parser
checks itsconfig_section
parameter; if defined, it adds that config file section tosettings_spec
(or to a new, emptydocutils.SettingsSpec
object), replacing anything defined earlier. (See Docutils Configuration Files for details.) Then it instantiates a newdocutils.frontend.OptionParser
object, passing the following relevant arguments:components
: A tuple ofdocutils.SettingsSpec
objects,(self.parser, self.reader, self.writer, settings_spec)
defaults
(originally fromsettings_overrides
)
The
docutils.frontend.OptionParser
object’s__init__
method callsself.populate_from_components
withself.components
, which consists ofself
prepended to thecomponents
tuple it received.self
(docutils.frontend.OptionParser
) defines general Docutils settings.In
self.populate_from_components
, for each component passed,component.settings_spec
is processed andcomponent.settings_defaults
is applied. Then, for each component,component.settings_default_overrides
is applied. This two-loop process ensures thatcomponent.settings_default_overrides
can override the default settings of any other component.Back in
docutils.frontend.OptionParser.__init__
, thedefaults
parameter (derived from thesettings_overrides
parameter ofdocutils.core.Publisher.publish
) is overlaid overself.defaults
. Sosettings_overrides
has priority over allSettingsSpec
data.Next,
docutils.frontend.OptionParser.__init__
checks if configuration files are enabled (itsread_config_files
parameter is true, andself.defaults['_disable_config']
is false). If they are enabled (and normally, they are),self.get_standard_config_settings
is called. This reads the docutils configuration files, and returns a dictionary of settings. This is then overlaid onself.defaults
. So configuration file settings have priority over all software-defined defaults.Back in the
docutils.core.Publisher
object,self.setup_option_parser
returns theoption_parser
object to its caller,self.process_command_line
.self.process_command_line
callsoption_parser.parse_args
, which parses all command line options and returns adocutils.frontend.Values
object. This is assigned to thedocutils.core.Publisher
object’sself.settings
. So command-line options have priority over configuration file settings.When
option_parser.parse_args
is called, the source and destination command-line arguments are also parsed, and assigned to the_source
and_destination
attributes of what becomes thedocutils.core.Publisher
object’sself.settings
.From
docutils.core.Publisher.publish
,self.set_io
is called with no arguments. If eitherself.source
orself.destination
are not set, the correspondingself.set_source
andself.set_destination
are called, effectively with no arguments.self.set_source
checks for asource_path
parameter, and if there is none (which is the case for command-line use), it is taken fromself.settings._source
.self.source
is set by instantiating aself.source_class
object. For command-line front-end tools, the defaultself.source_class
is used,docutils.io.FileInput
.self.set_destination
does the same job for the destination thatself.set_source
does for the source (the defaultself.destination_class
isdocutils.io.FileOutput
).
Runtime Settings Processing From Applications¶
Applications process runtime settings in a different way than
command-line tools do. Instead of calling publish_cmdline
, the
application calls one of publish_file
, publish_string
, or
publish_parts
. These in turn call publish_programmatically
,
which implements a generic programmatic interface. Although an
application may also call publish_programmatically
directly, it is
not recommended (if it does seem to be necessary, please write to the
Docutils-develop mailing list).
publish_programmatically
accepts the same convenience function
parameters as publish_cmdline
. Where things differ is that
programmatic use does no command-line processing. Instead of calling
docutils.Publisher.process_command_line
(as publish_cmdline
does, via docutils.Publisher.publish
),
docutils.Publisher.process_programmatic_settings
is called to set
up the runtime settings.