Помимо всех удивительных ответов здесь есть способ использовать getattr
, чтобы сэкономить обильные строки кода и сохранить его уютно. Эта мысль возникла после ужасного представления кода, который иногда может быть необходим.
Сценарий
Предположим, что ваша структура каталогов выглядит следующим образом:
- superheroes.py
- properties.py
И , у вас есть функции для получения информации о Thor
, Iron Man
, Doctor Strange
в superheroes.py
. Вы очень хорошо записываете свойства всех из них в properties.py
в компактном dict
, а затем получаете к ним доступ.
properties.py
thor = {
'about': 'Asgardian god of thunder',
'weapon': 'Mjolnir',
'powers': ['invulnerability', 'keen senses', 'vortex breath'], # and many more
}
iron_man = {
'about': 'A wealthy American business magnate, playboy, and ingenious scientist',
'weapon': 'Armor',
'powers': ['intellect', 'armor suit', 'interface with wireless connections', 'money'],
}
doctor_strange = {
'about': ' primary protector of Earth against magical and mystical threats',
'weapon': 'Magic',
'powers': ['magic', 'intellect', 'martial arts'],
}
Теперь, скажем, вы хотите вернуть возможности каждого из них по запросу в superheroes.py
. Таким образом, есть функции, такие как
from .properties import thor, iron_man, doctor_strange
def get_thor_weapon():
return thor['weapon']
def get_iron_man_bio():
return iron_man['about']
def get_thor_powers():
return thor['powers']
... и другие функции, возвращающие разные значения на основе ключей и супергероя.
С помощью getattr
вы можете сделать что-то вроде:
from . import properties
def get_superhero_weapon(hero):
superhero = getattr(properties, hero)
return superhero['weapon']
def get_superhero_powers(hero):
superhero = getattr(properties, hero)
return superhero['powers']
Вы значительно сократили количество строк кода, функций и повторений!
О, и, конечно, если у вас есть плохие имена, такие как properties_of_thor
для переменных , они могут быть сделаны и доступны, просто выполняя
def get_superhero_weapon(hero):
superhero = 'properties_of_{}'.format(hero)
all_properties = getattr(properties, superhero)
return all_properties['weapon']
ПРИМЕЧАНИЕ. Для этой конкретной проблемы могут быть более разумные способы справиться с ситуацией, но идея состоит в том, чтобы дать представление об использовании getattr
в правильных местах, чтобы писать более чистый код.