1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
from inspect import getdoc, isroutine
from logging import error, warning
def _get_member_info(name, member):
type_ = str(type(member))
info = {
"type": type_,
}
if isinstance(member, property):
info["getter"] = getdoc(member.fget)
elif isroutine(member):
info["routine"] = (member.__name__, getdoc(member))
elif isinstance(member, (int, str, float, list, tuple, dict, set, frozenset)):
pass # we don't need any
elif "freeOrionAIInterface" in type_ or "freeorion" in type_:
pass # TODO we got some instance here, probably we should inspect it too.
else:
# instance properties will be already resolved
warning('[%s] Unexpected member "%s"(%s)', name, type(member), member)
return info
def _getmembers(obj, predicate=None):
"""Return all members of an object as (name, value) pairs sorted by name.
Optionally, only return members that satisfy a given predicate."""
results = []
for key in dir(obj):
try:
value = getattr(obj, key)
except AttributeError:
continue
except Exception as e:
message = [
"-" * 20,
f'Error in "{obj.__class__.__name__}.{key}" with error',
"..." * 20,
"Error info:",
str(e),
"..." * 20,
]
error("\n".join(message))
continue
if not predicate or predicate(value):
results.append((key, value))
results.sort()
return results
|