'Accessing non-subscriptable properties

Scripting the Blender, I successfully did bpy.ops.render.render(some_args) but bpy.ops.render['render'] fails with BPyOpsSubMod object is not subscriptable. This puzzles me since I expected that, likewise in Javascript, any Python object is a dictionary and I can access object methods either by obj.member or obj['member']. How do I work around the non-subscriptable properties when I want to reference them by name?



Solution 1:[1]

It's not true that every object is a dictionary. But most objects have a dictionary, accessible through the name .__dict__.

You can use either

bpy.ops.render.__dict__['render']

or

getattr(bpy.ops.render, 'render')

Solution 2:[2]

If you want to know what is inside a non-subscriptable object that does not have a dict you can do this:

import csv # use csv dialect as example object
a = csv.get_dialect('excel')
field_names = [v for v in dir(a) if not v.startswith('__')]
fields = [(getattr(a, v),v) for v in field_names]

print(fields)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 botenvouwer