* Added function: name_rlookup(). Imported from Cr2 analysis script, original name was: search_var_name. No edit has been made yet.master
parent
6333d20d67
commit
67f6e7bede
1 changed files with 57 additions and 0 deletions
@ -0,0 +1,57 @@ |
||||
# -*- python -*- |
||||
# |
||||
# wpylib.py.introspection |
||||
# Created: 20150819 |
||||
# Wirawan Purwanto |
||||
# |
||||
# Advanced introspection tools for python |
||||
# |
||||
|
||||
def name_rlookup(val, namespace, prefix=None, rx_match=None, lookup="dict"): |
||||
"""Reverse lookup of variable/object name. |
||||
|
||||
Yields the list of object names in the namespace whose respective values are |
||||
equal to `val`. |
||||
|
||||
This is useful for example to reverse-lookup an object's name, but only in |
||||
restricted contexts (e.g. when the value to look for is unique). |
||||
""" |
||||
# Imported 20150819 |
||||
# Original subroutine name: search_var_name (from Cr2_analysis_cbs.py). |
||||
if lookup == "dict": |
||||
names = namespace.keys() |
||||
else: |
||||
# attribute lookup |
||||
names = dir(namespace) |
||||
if prefix != None: |
||||
names_filt = [ n for n in names if n.startswith(prefix) ] |
||||
elif rx_match != None: |
||||
# TODO later: for my regexp object? |
||||
if True: |
||||
if isinstance(rx_match, basestring): |
||||
names_filt = [ n for n in names if re.search(rx_match, n) ] |
||||
else: |
||||
# assume a re.RegexObject-like object: |
||||
names_filt = [ n for n in names if rx_match.search(n) ] |
||||
else: |
||||
names_filt = names |
||||
names_match = [] |
||||
type_val = type(val) |
||||
if lookup == "dict": |
||||
for n in names_filt: |
||||
try: |
||||
v = namespace[n] |
||||
except: |
||||
continue |
||||
if type(v) == type_val and v == val: |
||||
names_match.append(n) |
||||
else: |
||||
for n in names_filt: |
||||
try: |
||||
v = getattr(namespace, n) |
||||
except: |
||||
continue |
||||
if type(v) == type_val and v == val: |
||||
names_match.append(n) |
||||
return names_match |
||||
|
Loading…
Reference in new issue