Reputation: 40748
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
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