Вы в основном спрашиваете: «Как мой код может обнаружить имя объекта?»
def animal_name(animal):
# here be dragons
return some_string
cat = 5
print(animal_name(cat)) # prints "cat"
A цитата от Фредрика Лунда (на comp.lang.python): особенно уместно здесь.
Точно так же, как вы получаете имя того кота, которого вы нашли на крыльце: сам кот (объект) не может сказать вам свое имя, и ему все равно - так что единственный способвыяснить, как он называется, спросить всех ваших соседей (пространства имен), является ли это их кошка (объект)…
… .и не удивляться, если вы обнаружите, что он известен под многими именами, иливообще никакого имени!
Ради интереса я попытался реализовать animal_name
с помощью модулей sys
и gc
и обнаружил, что окрестности также вызывали объект, который вы ласково называете "cat ", то есть буквальное целое число 5, под несколькими именами:
>>> cat, dog, fish = 5, 3, 7
>>> animal_name(cat)
['n_sequence_fields', 'ST_GID', 'cat', 'SIGTRAP', 'n_fields', 'EIO']
>>> animal_name(dog)
['SIGQUIT', 'ST_NLINK', 'n_unnamed_fields', 'dog', '_abc_negative_cache_version', 'ESRCH']
>>> animal_name(fish)
['E2BIG', '__plen', 'fish', 'ST_ATIME', '__egginsert', '_abc_negative_cache_version', 'SIGBUS', 'S_IRWXO']
Для достаточно уникальных объектов иногда вы можете получить уникальное имя:
>>> mantis_shrimp = 696969; animal_name(mantis_shrimp)
['mantis_shrimp']
Итак, в итоге: