Håkon Hægland
Håkon Hægland

Reputation: 40748

How to set the module name of a dynamically created class?

I am using Python 3 to create a dynamic class:

def setup(namespace):
    namespace['a'] = 1

A = types.new_class('A', bases=(), kwds=None, exec_body=setup)

class B:
    b = 2

print(A)
print(B)

Output:

<class 'types.A'>
<class '__main__.B'>

I would like to put the class A also in the __main__ module/scope (instead of the types module/scope). How can that be done?

Upvotes: 2

Views: 206

Answers (1)

Martijn Pieters
Martijn Pieters

Reputation: 1121904

Just set the __module__ attribute after the fact:

A.__module__ == '__main__'

You can do this in the exec_body callable:

def setup(namespace):
    namespace['a'] = 1
    namespace['__module__'] = '__main__'

Demo:

>>> import types
>>> def setup(namespace):
...     namespace['a'] = 1
...
>>> A = types.new_class('A', bases=(), kwds=None, exec_body=setup)
>>> A.__module__ = '__main__'
>>> A
<class '__main__.A'>

or with the exec_body() callable:

>>> def setup(namespace):
...     namespace['a'] = 1
...     namespace['__module__'] = '__main__'
...
>>> A = types.new_class('A', bases=(), kwds=None, exec_body=setup)
>>> A
<class '__main__.A'>

Upvotes: 2

Related Questions