| # 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 |