Thanks Daniel,

I found my answer here (using your link):
https://docs.python.org/3/reference/datamodel.html#preparing-the-class-namespace

"""
When a new class is created by type.__new__, the object provided as the
namespace parameter is copied to a new ordered mapping and the original
object is discarded.
"""

Therefore the answer seems to be that
https://www.python.org/dev/peps/pep-3115/ needs to be updated & fixed.

Replace the following:

"""

    def __new__(cls, name, bases, classdict):
        # Note that we replace the classdict with a regular
        # dict before passing it to the superclass, so that we
        # don't continue to record member names after the class
        # has been created.
        result = type.__new__(cls, name, bases, dict(classdict))
        result.member_names = classdict.member_names
        return result

"""

With:

"""
def __new__(cls, name, bases, classdict):

        result = type.__new__(cls, name, bases, classdict)
        result.member_names = classdict.member_names
        return result

"""

Removing the incorrect comments & the copying of `classdict`

I will go file a bug report to that effect.

Thanks,

Joy Diamond.



On Sat, Nov 3, 2018 at 7:55 PM Daniel Moisset <dfmois...@gmail.com> wrote:

> If I understood correctly what you want, it's possible with a metaclass.
> Check the __prepare__ method at
> https://docs.python.org/3/reference/datamodel.html#preparing-the-class-namespace
> and Pep 3115
>
> On Sat, 3 Nov 2018, 20:55 Joy Diamond <python....@gmail.com wrote:
>
>> Team,
>>
>> Are we supposed to be able to have our own class dictionary in python 3?
>>
>> If we currently cannot -- do we want to be able to?
>>
>> That we can have out own class dictionary in python 3 is strongly implied
>> in the following at https://www.python.org/dev/peps/pep-3115/ where it
>> says:
>>
>> """
>>
>>     # The metaclass invocation
>>     def __new__(cls, name, bases, classdict):
>>         # Note that we replace the classdict with a regular
>>         # dict before passing it to the superclass, so that we
>>         # don't continue to record member names after the class
>>         # has been created.
>>         result = type.__new__(cls, name, bases, dict(classdict))
>>         result.member_names = classdict.member_names
>>         return result
>>
>> """
>>
>> I don't understand this.  As far as I can tell, no matter what class
>> dictionary you pass into `type.__new__` it creates a copy of it.
>>
>> Am I missing something?  Is this supposed to work?  Is the documentation
>> wrong?
>>
>> Thanks,
>>
>> Joy Diamond.
>>
>> Program that shows that the class dictionary created is not what we pass
>> in --- Shows the actual symbol table is `dict` not `SymbolTable`
>>
>> class SymbolTable(dict):
>>     pass
>>
>> members = SymbolTable(a = 1)
>>
>> X = type('X', ((object,)), members)
>>
>> members['b'] = 2
>>
>> print('X.a: {}'.format(X.a))
>>
>> try:
>>     print('X.b: {}'.format(X.b))
>> except AttributeError as e:
>>     print('X.b: does not exist')
>>
>> #
>> #   Get the actual symbol table of `X`, bypassing the mapping proxy.
>> #
>> X__symbol_table = __import__('gc').get_referents(X.__dict__)[0]
>>
>> print('The type of the actual symbol table of X is: {} with keys:
>> {}'.format(
>>       type(X__symbol_table),
>>       X__symbol_table.keys()))
>>
>>
>> # Prints out
>> # X.a: 1
>> # X.b: does not exist
>> # The type of the actual symbol table of X is: <class 'dict'> with keys:
>> dict_keys(['a', '__module__', '__dict__', '__weakref__', '__doc__'])
>>
>>
>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail&utm_term=icon>
>>  Virus-free.
>> www.avast.com
>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail&utm_term=link>
>> <#m_3863327966708087084_m_7370047320667964513_m_603818574152564677_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
>> _______________________________________________
>> Python-ideas mailing list
>> Python-ideas@python.org
>> https://mail.python.org/mailman/listinfo/python-ideas
>> Code of Conduct: http://python.org/psf/codeofconduct/
>>
>
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to