Использование распределенной блокировки для определенного метода на основе параметра пути

Помимо всех удивительных ответов здесь есть способ использовать 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 в правильных местах, чтобы писать более чистый код.

0
задан Joan Grau 17 January 2019 в 08:55
поделиться