naringas / craftinginterpreters-plox

Lox from Crafting Interpreters but in Python
0 stars 0 forks source link

`@unique` errors #1

Closed ysangkok closed 1 year ago

ysangkok commented 1 year ago

on commit bf4507bfcb25a5d734cb2e54d9cf59e8ccee5c78

trying the command in the readme is erroring

% python --version   
Python 3.11.3
% python plox/plox.py
Traceback (most recent call last):
  File "/home/janus/flipstone/craftinginterpreters-plox/plox/plox.py", line 3, in <module>
    from scanner import Scanner, Token, TokenType
  File "/home/janus/flipstone/craftinginterpreters-plox/plox/scanner.py", line 12, in <module>
    @unique
     ^^^^^^
  File "/home/janus/.pyenv/versions/3.11.3/lib/python3.11/enum.py", line 1561, in unique
    raise ValueError('duplicate values found in %r: %s' %
ValueError: duplicate values found in <enum 'TokenType'>: NUMBER -> STRING, EOF -> STRING

Changing Enum to StrEnum seems to work.

naringas commented 1 year ago

strange, i don't get this error (clearly)... but i'm using python 3.10

I don't understand why this error, the TokenType enum has the @unique decorator. AND the token types that it complains about having dupe values are both values set by auto https://docs.python.org/3/library/enum.html#enum.auto

but we know this parts of the python Enum got intervened between 3.10 and 3.11.

Changed in version 3.11.1: In prior versions, auto() had to be the only thing on the assignment line to work properly.

something warrants a deeper dive... without having yet figured this out, I blame python, it's their bug my code is perfect 😂😅

naringas commented 1 year ago

In python 3.10 there is no such a thing as StrEnum... so why should adding a new kind of Enum, break older python Enums that used to work fine? https://docs.python.org/3/library/enum.html#enum.StrEnum

ysangkok commented 1 year ago

Yeah, it's weird that the 3.11 changelog doesn't mention changes to auto...

naringas commented 1 year ago

it's a python bug, a regression of some kind. They have been tweaking enum.py

https://github.com/python/cpython/issues/91456 https://github.com/python/cpython/pull/91457#

ysangkok commented 1 year ago

How can it be an existing bug in 3.11.3 if both of those are marked fixed/merged in 2022 and 3.11.3 was released last month?

naringas commented 1 year ago

it's an exisiting bug cuz we just found it, but it's not a known bug, so far as I've looked.

ysangkok commented 1 year ago

Ah, ok, I understand. Looking at the 91456, that is about aliases, which you don't have. And 91457 was backported as 94156 (note how that is not 91456) which suggests that it should only emit a DeprecationWarning but still work, which it doesn't.

naringas commented 1 year ago

so I suppose that your solution, of using StrEnum instead of Enum is THE workaround... but Python should not break like this between 3.10 and 3.11....

all that remains if filling the bug report to Python. https://github.com/python/cpython/issues/104271

naringas commented 1 year ago

I made a fix for this, but I haven't bothered to update my local python version, could you test it?

this is the fix https://github.com/naringas/craftinginterpreters-plox/commit/e1d7426d24aff6e9d50779e2d5ede7d4172d843f#diff-69834159763133611b2ce61f9c7fdd35941c705fc1520ce40f294c9b208852a6L12