Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 1088481
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 16, 20262026-05-16T23:04:33+00:00 2026-05-16T23:04:33+00:00

The following code doesn’t compile; it says NameError: name ‘fields’ is not defined in

  • 0

The following code doesn’t compile; it says

NameError: name ‘fields’ is not
defined

in the last line. Is it because __new__ isn’t called until after the fields assignment is reached? What should I do?

class Meta(type):
    def __new__(mcs, name, bases, attr):
        attr['fields'] = {}
        return type.__new__(mcs, name, bases, attr)

class A(metaclass = Meta):
    def __init__(self, name):
        pass

class B(A):
    fields['key'] = 'value'

EDIT:

I found that it’s not a problem with timing; it’s a problem with name hiding. Works fine if I write A.fields instead.

I’d like to know why I can’t use fields or super().fields.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-16T23:04:34+00:00Added an answer on May 16, 2026 at 11:04 pm

    The fields['key'] = 'value' runs before the metaclass machinery kicks in.

    class foo(object):
        var1 = 'bar'
    
        def foobar(self):
            pass
    

    when python hits the class statement, it enters a new local namespace.

    1. it evaluates the var1 = 'bar' statement. this is equivalent to locals()['var1'] = 'bar'

    2. it then evaluates the def foobar statement. this is equivalent to locals()['var'] = the result of compiling the function

    3. It then passes locals(), along with the classname, the inherited classes and the metaclass to the metaclasses __new__ method. In the example case, the metaclass is simply type.

    4. It then exits the new local namespace and sticks the class object returned from __new__ in the outer namespace with the name foo.

    Your code works when you use A.fields because the class A has already been created and the above process has hence been executed with your Meta installing fields in A.

    You can’t use super().fields because the classname B is not defined to pass to super at the time that super would run. that is that you would need it to be super(B).fields but B is defined after class creation.

    Update

    Here’s some code that will do what you want based on your reply to my comment on the question.

    def MakeFields(**fields):
        return fields
    
    class Meta(type):
        def __new__(mcs, name, bases, attr):
            for base in bases:
                if hasattr(base, 'fields'):
                    inherited = getattr(base, 'fields')
                    try:
                        attr['fields'].update(inherited)
                    except KeyError:
                        attr['fields'] = inherited
                    except ValueError:
                        pass
            return type.__new__(mcs, name, bases, attr)
    
    class A(metaclass=Meta):
        fields = MakeFields(id='int',name='varchar') 
    
    class B(A):
        fields = MakeFields(count='int')
    
    class C(B):
        pass
    
    class Test(object):
        fields = "asd"
    
    class D(C, Test):
        pass
    
    print C.fields
    print D.fields
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

The following code doesn't compile with gcc, but does with Visual Studio: template <typename
The following code does not compile: public class GenericsTest { public static void main(String[]
The following Code does not compile Dim BasicGroups As String() = New String() {Node1,
The following code doesn't compile ( error CS0123: No overload for 'System.Convert.ToString(object)' matches delegate
The following code doesn't compile for obvious reasons, namely that Foo is trying to
Any idea why the following code doesn't print the amount of characters in the
Given the following code (that doesn't work): while True: # Snip: print out current
Why doesn't code like the following catch CTRL-C? MAXVAL = 10000 STEP_INTERVAL = 10
How can you enumerate an enum in C#? E.g. the following code does not
Why does the following code not work as I was expecting? <?php $data =

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.