Creates a function_utils and pull a function_identifer method into
[python_utils.git] / function_utils.py
diff --git a/function_utils.py b/function_utils.py
new file mode 100644 (file)
index 0000000..5b70981
--- /dev/null
@@ -0,0 +1,26 @@
+#!/usr/bin/env python3
+
+from typing import Callable
+
+
+def function_identifier(f: Callable) -> str:
+    """
+    Given a callable function, return a string that identifies it.
+    Usually that string is just __module__:__name__ but there's a
+    corner case: when __module__ is __main__ (i.e. the callable is
+    defined in the same module as __main__).  In this case,
+    f.__module__ returns "__main__" instead of the file that it is
+    defined in.  Work around this using pathlib.Path (see below).
+
+    >>> function_identifier(function_identifier)
+    'function_utils:function_identifier'
+
+    """
+    if f.__module__ == '__main__':
+        from pathlib import Path
+        import __main__
+        module = __main__.__file__
+        module = Path(module).stem
+        return f'{module}:{f.__name__}'
+    else:
+        return f'{f.__module__}:{f.__name__}'