Skip to content

Commit dde1452

Browse files
committed
Make the qualname usage optional
1 parent 979eaf8 commit dde1452

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

dogpile/cache/util.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from ..util import compat, langhelpers
44

55

6-
def function_key_generator(namespace, fn, to_str=str):
6+
def function_key_generator(namespace, fn, to_str=str, use_qual_name=False):
77
"""Return a function that generates a string
88
key, based on a given function as well as
99
arguments to the returned function itself.
@@ -15,17 +15,27 @@ def function_key_generator(namespace, fn, to_str=str):
1515
the :paramref:`.CacheRegion.function_key_generator` argument
1616
for :class:`.CacheRegion`.
1717
18+
:param namespace: A string namespace to be used in the key.
19+
:param fn: The function which will be called.
20+
:param to_str: A function that will convert arguments to strings.
21+
:param use_qual_name: If True, use the qualified name of the function
22+
instead of just the name. This is useful to avoid collision in modules
23+
that defines more than one class containing methods with the same name.
24+
1825
.. seealso::
1926
2027
:func:`.kwarg_function_key_generator` - similar function that also
2128
takes keyword arguments into account
2229
2330
"""
31+
fn_name = fn.__name__
32+
if use_qual_name:
33+
fn_name = fn.__qualname__
2434

2535
if namespace is None:
26-
namespace = "%s:%s" % (fn.__module__, fn.__qualname__)
36+
namespace = "%s:%s" % (fn.__module__, fn_name)
2737
else:
28-
namespace = "%s:%s|%s" % (fn.__module__, fn.__qualname__, namespace)
38+
namespace = "%s:%s|%s" % (fn.__module__, fn_name, namespace)
2939

3040
args = compat.inspect_getargspec(fn)
3141
has_self = args[0] and args[0][0] in ("self", "cls")

tests/cache/test_util.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,37 @@ def instance_method(self):
1414
pass
1515

1616

17+
def test_function_key_generator_qualname():
18+
key_generator = util.function_key_generator(
19+
None, A.class_method, use_qual_name=True
20+
)
21+
assert key_generator() == "tests.cache.test_util:A.class_method|"
22+
23+
key_generator = util.function_key_generator(
24+
None, A.static_method, use_qual_name=True
25+
)
26+
assert key_generator() == "tests.cache.test_util:A.static_method|"
27+
28+
key_generator = util.function_key_generator(
29+
None, A.instance_method, use_qual_name=True
30+
)
31+
assert key_generator() == "tests.cache.test_util:A.instance_method|"
32+
33+
key_generator = util.function_key_generator(
34+
"namespace", A.class_method, use_qual_name=True
35+
)
36+
assert key_generator() == "tests.cache.test_util:A.class_method|namespace|"
37+
38+
1739
def test_function_key_generator():
1840
key_generator = util.function_key_generator(None, A.class_method)
19-
assert key_generator() == "tests.cache.test_util:A.class_method|"
41+
assert key_generator() == "tests.cache.test_util:class_method|"
2042

2143
key_generator = util.function_key_generator(None, A.static_method)
22-
assert key_generator() == "tests.cache.test_util:A.static_method|"
44+
assert key_generator() == "tests.cache.test_util:static_method|"
2345

2446
key_generator = util.function_key_generator(None, A.instance_method)
25-
assert key_generator() == "tests.cache.test_util:A.instance_method|"
47+
assert key_generator() == "tests.cache.test_util:instance_method|"
2648

2749
key_generator = util.function_key_generator("namespace", A.class_method)
28-
assert key_generator() == "tests.cache.test_util:A.class_method|namespace|"
50+
assert key_generator() == "tests.cache.test_util:class_method|namespace|"

0 commit comments

Comments
 (0)