I had to write a custom function to load a yaml file from the current working directory. The function itself works and my intention was to write it in a pure fashion but my senior colleague told me that the way I wrote this function is utterly bad and I have to rewrite it.
Which commandment in Python did I violate? Can anyone tell me what I did wrong here and how a "professional" solution would look like?
from typing import Dict
import yaml
from yaml import SafeLoader
from pathlib import Path
import os
def read_yaml_from_cwd(file: str) -> Dict:
"""[reads a yaml file from current working directory]
Parameters
----------
file : str
[.yaml or .yml file]
Returns
-------
Dict
[Dictionary]
"""
path = os.path.join(Path.cwd().resolve(), file)
if os.path.isfile(path):
with open(path) as f:
content = yaml.load(f, Loader=SafeLoader)
return content
else:
return None
content = read_yaml_from_cwd("test.yaml")
print(content)
1 Answer 1
Which commandment did you violate? Using os.path
and pathlib
in the same breath! pathlib
is an object-oriented replacement to os.path
.
path = os.path.join(Path.cwd().resolve(), file)
if os.path.isfile(path):
with open(path) as f:
could be written as:
path = Path.cwd().joinpath(file)
if path.is_file():
with path.open() as f:
or since you're starting at the current directory, simply:
path = Path(file)
if path.is_file():
with path.open() as f:
-
\$\begingroup\$ I am using
ruamel yaml
in my own project, so I might be missremembering the details. I thought one could simply docontent = yaml.load(path, Loader=SafeLoader)
directly on the path without having to explicitly open it? \$\endgroup\$N3buchadnezzar– N3buchadnezzar2021年12月02日 19:00:03 +00:00Commented Dec 2, 2021 at 19:00 -
\$\begingroup\$ @N3buchadnezzar That may be true; I haven't used
yaml
at all. My answer focused on the mashup betweenos.path
andpathlib
, stopping just before theyaml.load(...)
line for that very reason. \$\endgroup\$AJNeufeld– AJNeufeld2021年12月02日 19:05:33 +00:00Commented Dec 2, 2021 at 19:05