mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-17 07:20:53 +07:00
64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
# coding=utf-8
|
|
"""
|
|
.NET (CLR) specific functions
|
|
"""
|
|
__author__ = 'Ilya.Kazakevich'
|
|
|
|
|
|
def get_namespace_by_name(object_name):
|
|
"""
|
|
Gets namespace for full object name. Sometimes last element of name is module while it may be class.
|
|
For System.Console returns System, for System.Web returns System.Web.
|
|
Be sure all required assemblies are loaded (i.e. clr.AddRef.. is called)
|
|
:param object_name: name to parse
|
|
:return: namespace
|
|
"""
|
|
(imported_object, object_name) = _import_first(object_name)
|
|
parts = object_name.partition(".")
|
|
first_part = parts[0]
|
|
remain_part = parts[2]
|
|
|
|
while remain_part and type(_get_attr_by_name(imported_object, remain_part)) is type: # While we are in class
|
|
remain_part = remain_part.rpartition(".")[0]
|
|
|
|
if remain_part:
|
|
return first_part + "." + remain_part
|
|
else:
|
|
return first_part
|
|
|
|
|
|
def _import_first(object_name):
|
|
"""
|
|
Some times we can not import module directly. For example, Some.Class.InnerClass could not be imported: you need to import "Some.Class"
|
|
or even "Some" instead. This function tries to find part of name that could be loaded
|
|
|
|
:param object_name: name in dotted notation like "Some.Function.Here"
|
|
:return: (imported_object, object_name): tuple with object and its name
|
|
"""
|
|
while object_name:
|
|
try:
|
|
return (__import__(object_name, globals=[], locals=[], fromlist=[]), object_name)
|
|
except ImportError:
|
|
object_name = object_name.rpartition(".")[0] # Remove rightest part
|
|
raise Exception("No module name found in name " + object_name)
|
|
|
|
|
|
def _get_attr_by_name(obj, name):
|
|
"""
|
|
Accepts chain of attributes in dot notation like "some.property.name" and gets them on object
|
|
:param obj: object to introspec
|
|
:param name: attribute name
|
|
:return attribute
|
|
|
|
>>> str(_get_attr_by_name("A", "__class__.__class__"))
|
|
"<type 'type'>"
|
|
|
|
>>> str(_get_attr_by_name("A", "__class__.__len__.__class__"))
|
|
"<type 'method_descriptor'>"
|
|
"""
|
|
result = obj
|
|
parts = name.split('.')
|
|
for part in parts:
|
|
result = getattr(result, part)
|
|
return result
|