[issue45531] field "mro" behaves strangely in dataclass

2021-10-23 Thread Serhiy Storchaka


Serhiy Storchaka  added the comment:

Would not be more correct to look at cls.__dict__[fieldname]?

BTW, mro() cannot be builtin, because you should be able to override it in some 
classes.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45531] field "mro" behaves strangely in dataclass

2021-10-22 Thread Eric V. Smith


Eric V. Smith  added the comment:

The problem is that dataclasses is looking for a default value for a field by 
looking at getattr(cls, fieldname), which returns a value when fieldname is 
"mro".

I think the best thing to do, at least for now, is prohibit a field named "mro".

Ultimately I'd like to see cls.mro go away (maybe being replaced by a builtin), 
but I realize that's not likely to happen.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45531] field "mro" behaves strangely in dataclass

2021-10-22 Thread Serhiy Storchaka


Serhiy Storchaka  added the comment:

Where does dataclasses call mro()?

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45531] field "mro" behaves strangely in dataclass

2021-10-22 Thread Éric Araujo

Éric Araujo  added the comment:

If dataclasses wanted to allow fields named `mro`, it could replace its call to 
`cls.mro()` with `type.mro(cls)`.  But I don’t know if there is a strong use 
case for such a field.

--
nosy: +eric.araujo

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45531] field "mro" behaves strangely in dataclass

2021-10-20 Thread Eric V. Smith


Eric V. Smith  added the comment:

I think the only other thing that could be done is to have a special test for 
"default is type.mro", and if so, don't assume it's a default value. Which 
means that you could never actually use:

@dataclass
class A:
   mro: object = type.mro

But it's probably best to just disallow a field named "mro". Which is 
unfortunate, but such is life. It's a shame mro isn't a builtin, so we could do 
mro(A) instead of A.mro().

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45531] field "mro" behaves strangely in dataclass

2021-10-20 Thread Finite State Machine


Finite State Machine  added the comment:

For what it's worth, I think a sensible exception message solves this problem. 
While it would be nice to be able to use a field called 'mro', that's an 
enhancement; the misleading exception message is a bug.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45531] field "mro" behaves strangely in dataclass

2021-10-20 Thread Serhiy Storchaka


Serhiy Storchaka  added the comment:

In Enum it is just implicitly forbidden:

>>> from enum import *
>>> class A(Enum):
...   mro = 1
...   x = 2
... 
Traceback (most recent call last):
  File "", line 1, in 
  File "/home/serhiy/py/cpython/Lib/enum.py", line 430, in __new__
raise ValueError('Invalid enum member name: {0}'.format(

ValueError: Invalid enum member name: mro

--
nosy: +serhiy.storchaka

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45531] field "mro" behaves strangely in dataclass

2021-10-19 Thread Eric V. Smith


Eric V. Smith  added the comment:

I agree on your analysis. You'll get the same error on any name that type 
defines (like __class__), but "mro" looks like the only one without dunders.

I'm not sure the best way to fix this. I'll give it some thought.

Another problem is that assigning a default value breaks the .mro() call:

@dataclass
class A:
mro: object = 3

>>> A.mro()
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'int' object is not callable

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45531] field "mro" behaves strangely in dataclass

2021-10-19 Thread Eric V. Smith


Change by Eric V. Smith :


--
assignee:  -> eric.smith
nosy: +eric.smith

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45531] field "mro" behaves strangely in dataclass

2021-10-19 Thread Finite State Machine


New submission from Finite State Machine :

The following Python script:

from dataclasses import dataclass

@dataclass
class A:
mro: object
x: object

Results in the following unexpected exception:

Traceback (most recent call last):
  File "/Users/dsuffling/.pyenv/versions/3.10.0/lib/python3.10/runpy.py", 
line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
  File "/Users/dsuffling/.pyenv/versions/3.10.0/lib/python3.10/runpy.py", 
line 86, in _run_code
exec(code, run_globals)
  File "/Users/dsuffling/names/junk.py", line 6, in 
class A:
  File 
"/Users/dsuffling/.pyenv/versions/3.10.0/lib/python3.10/dataclasses.py", line 
1178, in dataclass
return wrap(cls)
  File 
"/Users/dsuffling/.pyenv/versions/3.10.0/lib/python3.10/dataclasses.py", line 
1169, in wrap
return _process_class(cls, init, repr, eq, order, unsafe_hash,
  File 
"/Users/dsuffling/.pyenv/versions/3.10.0/lib/python3.10/dataclasses.py", line 
1019, in _process_class
_init_fn(all_init_fields,
  File 
"/Users/dsuffling/.pyenv/versions/3.10.0/lib/python3.10/dataclasses.py", line 
540, in _init_fn
raise TypeError(f'non-default argument {f.name!r} '
TypeError: non-default argument 'x' follows default argument


The name of the first attribute ('mro') is critical; without it the problem 
does not occur.

It appears that 'mro' is somehow interacting with the 'mro' attribute of the 
'type' object.

This issue has been verified to occur with CPython 3.10.0.

--
components: Library (Lib)
messages: 404378
nosy: finite-state-machine
priority: normal
severity: normal
status: open
title: field "mro" behaves strangely in dataclass
type: behavior
versions: Python 3.10

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com