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 .pyfor 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
- DECISIONand- SPAINvariables in- main.py:
$ python main.py
['DECISION', 'SETTINGS_FILES', 'SPAIN', 'VARIABLES', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__warningregistry__', 'setting_file', 'yaml']
- DECISIONand- BURIEDvariables in- publishconf.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()
 
    