1. Summary
I can't find, how I can add variables from YAML files to Python files without duplicates.
2. Purpose
I use Pelican — static sites generator. It use .py
files for configuration. Problems:
- I can't reuse variables from
.py
for JavaScript import *
antipattern, that use even in official Pelican blog
I try move configuration to YAML files → I get problem of this question.
3. MCVE
3.1. Files
main.py
:
"""First Python file."""
# [INFO] Using ruamel.yaml — superset of PyYAML:
# https://stackoverflow.com/a/38922434/5951529
import ruamel.yaml as yaml
SETTINGS_FILES = ["kira.yaml", "kristina.yaml"]
for setting_file in SETTINGS_FILES:
VARIABLES = yaml.safe_load(open(setting_file))
# [INFO] Convert Python dictionary to variables:
# https://stackoverflow.com/a/36059129/5951529
locals().update(VARIABLES)
# [INFO] View all variables:
# https://stackoverflow.com/a/633134/5951529
print(dir())
publishconf.py
:
"""Second Python file."""
import ruamel.yaml as yaml
# [NOTE] Another value in list
SETTINGS_FILES = ["kira.yaml", "katya.yaml"]
for setting_file in SETTINGS_FILES:
VARIABLES = yaml.load(open(setting_file))
locals().update(VARIABLES)
print(dir())
kira.yaml
:
DECISION: Saint Petersburg
kristina.yaml
:
SPAIN: Marbella
katya.yaml
:
BURIED: Novoshakhtinsk
3.2. Expected behavior
DECISION
andSPAIN
variables inmain.py
:
$ python main.py
['DECISION', 'SETTINGS_FILES', 'SPAIN', 'VARIABLES', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__warningregistry__', 'setting_file', 'yaml']
DECISION
andBURIED
variables inpublishconf.py
:
$ python publishconf.py
['BURIED', 'DECISION', 'SETTINGS_FILES', 'VARIABLES', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__warningregistry__', 'setting_file', 'yaml']
3.3. Problem
Duplicate loop in main.py
and publishconf.py
:
for setting_file in SETTINGS_FILES:
VARIABLES = yaml.load(open(setting_file))
locals().update(VARIABLES)
Can I not use duplicates?
4. Not helped
4.1. Configuration file
config.py
:
"""Config Python file."""
# [INFO] Using ruamel.yaml — superset of PyYAML:
# https://stackoverflow.com/a/38922434/5951529
import ruamel.yaml as yaml
MAIN_CONFIG = ["kira.yaml", "kristina.yaml"]
PUBLISHCONF_CONFIG = ["kira.yaml", "katya.yaml"]
def kirafunction(pelicanplugins):
"""Function for both Python files."""
for setting_file in pelicanplugins:
# [INFO] Convert Python dictionary to variables:
# https://stackoverflow.com/a/36059129/5951529
variables = yaml.safe_load(open(setting_file))
globals().update(variables)
def main_function():
"""For main.py."""
kirafunction(MAIN_CONFIG)
def publishconf_function():
"""For publishconf.py."""
kirafunction(PUBLISHCONF_CONFIG)
main.py
:
"""First Python file."""
import sys
from config import main_function
sys.path.append(".")
main_function()
# [INFO] View all variables:
# https://stackoverflow.com/a/633134/5951529
print(dir())
publishconf.py
:
"""Second Python file."""
import sys
from config import publishconf_function
sys.path.append(".")
publishconf_function()
print(dir())
Variables from main_function
and publishconf_function
doesn't share across files:
$ python main.py
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'main_function', 'signal', 'sys']
4.2. Another attempts
Wrap loop to function as in this example:
def kirafunction(): """Docstring.""" for setting_file in SETTINGS_FILES: VARIABLES = yaml.safe_load(open(setting_file)) locals().update(VARIABLES) kirafunction()