eyeseast / python-frontmatter

Parse and manage posts with YAML (or other) frontmatter
http://python-frontmatter.rtfd.io
MIT License
333 stars 42 forks source link

Using 'content' as a metadata key breaks frontmatter #96

Open harleypig opened 2 years ago

harleypig commented 2 years ago

If I have a file with content as a key in the frontmatter, frontmatter dies a horrible death.

Example markdown file (test.md):

---
content: bad key
---
Ooops!

Example python file (badkey.py):

import frontmatter
post = frontmatter.load('test.md')

When running python badkey.py you get:

$ python badkey.py 
Traceback (most recent call last):
  File "/home/harleypig/work/pfm/badkey.py", line 3, in <module>
    post = frontmatter.load('test.md')
  File "/home/harleypig/.local/lib/python3.10/site-packages/frontmatter/__init__.py", line 150, in load
    return loads(text, encoding, handler, **defaults)
  File "/home/harleypig/.local/lib/python3.10/site-packages/frontmatter/__init__.py", line 166, in loads
    return Post(content, handler, **metadata)
TypeError: Post.__init__() got multiple values for argument 'content'
merwok commented 2 years ago

To fix this, Python 3.8 added positional-only parameters:

def __init__(self, content, hander, /, **metadata);
    ...
eyeseast commented 2 years ago

I've thought about that. Not sure I'm ready to drop Python 3.7 just yet, but it's an option.

merwok commented 2 years ago

What about __init__(_self, _content, _handler, **metadata) then?

Or alternatively metadata as a dict, without kwarg unpacking?

eyeseast commented 2 years ago

The first option is probably better. Second would break backwards compatibility, and I'd rather not do that if I can avoid it.

Also, Python 3.7 has almost a year until EOL, so can't do positional-only arguments just yet.