python-frontmatter icon indicating copy to clipboard operation
python-frontmatter copied to clipboard

Using 'content' as a metadata key breaks frontmatter

Open harleypig opened this issue 3 years ago • 7 comments

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'

harleypig avatar Aug 28 '22 18:08 harleypig

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

def __init__(self, content, hander, /, **metadata);
    ...

merwok avatar Aug 28 '22 19:08 merwok

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

eyeseast avatar Aug 28 '22 23:08 eyeseast

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

Or alternatively metadata as a dict, without kwarg unpacking?

merwok avatar Aug 29 '22 01:08 merwok

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.

eyeseast avatar Aug 29 '22 01:08 eyeseast