Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/tensorflow/python/framework/registry.py: 74%
31 statements
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
1# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14# ==============================================================================
16"""Registry mechanism for "registering" classes/functions for general use.
18This is typically used with a decorator that calls Register for adding
19a class or function to a registry.
20"""
22import traceback
24from tensorflow.python.platform import tf_logging as logging
25from tensorflow.python.util import compat
28# Registry mechanism below is based on mapreduce.python.mrpython.Register.
29_LOCATION_TAG = "location"
30_TYPE_TAG = "type"
33class Registry(object):
34 """Provides a registry for saving objects."""
36 __slots__ = ["_name", "_registry"]
38 def __init__(self, name):
39 """Creates a new registry."""
40 self._name = name
41 self._registry = {}
43 def register(self, candidate, name=None):
44 """Registers a Python object "candidate" for the given "name".
46 Args:
47 candidate: The candidate object to add to the registry.
48 name: An optional string specifying the registry key for the candidate.
49 If None, candidate.__name__ will be used.
50 Raises:
51 KeyError: If same name is used twice.
52 """
53 if not name:
54 name = candidate.__name__
55 if name in self._registry:
56 frame = self._registry[name][_LOCATION_TAG]
57 raise KeyError(
58 "Registering two %s with name '%s'! "
59 "(Previous registration was in %s %s:%d)" %
60 (self._name, name, frame.name, frame.filename, frame.lineno))
62 logging.vlog(1, "Registering %s (%s) in %s.", name, candidate, self._name)
63 # stack trace is [this_function, Register(), user_function,...]
64 # so the user function is #2.
65 stack = traceback.extract_stack(limit=3)
66 stack_index = min(2, len(stack) - 1)
67 if stack_index >= 0:
68 location_tag = stack[stack_index]
69 else:
70 location_tag = ("UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN")
71 self._registry[name] = {_TYPE_TAG: candidate, _LOCATION_TAG: location_tag}
73 def list(self):
74 """Lists registered items.
76 Returns:
77 A list of names of registered objects.
78 """
79 return self._registry.keys()
81 def lookup(self, name):
82 """Looks up "name".
84 Args:
85 name: a string specifying the registry key for the candidate.
86 Returns:
87 Registered object if found
88 Raises:
89 LookupError: if "name" has not been registered.
90 """
91 name = compat.as_str(name)
92 if name in self._registry:
93 return self._registry[name][_TYPE_TAG]
94 else:
95 raise LookupError(
96 "%s registry has no entry for: %s" % (self._name, name))