2015-04-30 2 views
3

Я новичок в Python.Лучшая практика для функций «получить»

Предположим, у меня есть словарь, который содержит состояние управления электропитанием. (ОК = включено. FAIL = выключено).

Есть несколько способов, чтобы написать функцию "получить":

1-й путь

is_power_supply_off(dictionary) 
    gets the admin state from dictionary. 
    returns true if turned off. 
    returns false if turned on. 

is_power_supply_on(dictionary) 
    gets the admin state from dictionary. 
    returns true if turned on. 
    returns false if turned off. 

2-й путь

is_power_supply_on_or_off(dictionary, on_or_off) 
    gets the admin state from dictionary. 
    returns true/false based on the received argument 

3-й путь

get_power_supply_admin_state(dictionary) 
    gets the admin state from dictionary. 
    return value. 

Тогда я могу спросить в функцию, которая вызывает функцию ПОЛУЧИТЬ

if get_power_supply_admin_state() == turned_on/turned_off... 

Мои вопросы:

Какой из выше считается наилучшей практики?

Если все три способа в порядке, и это просто вопрос стиля, пожалуйста, дайте мне знать.

1-й путь считается «дублированием кода»? Я спрашиваю об этом, потому что я могу объединить две функции как одну (добавив аргумент, как и во втором). Тем не менее, ИМО, первый способ более читабельен, чем второй способ.

Буду признателен, если вы можете поделиться своими мыслями о каждом из способов, я указанные.

заранее спасибо!

+0

Вы считаете, что «состояние администратора» является хранимым булевым или что-то, что необходимо оценить? – SuperBiasedMan

+0

Я предполагаю, что второй и третий методы будут предпочтительнее первого. – ZdaR

+0

SuperBiasedMan, ваш комментарий верен. Я отредактировал вопрос, чтобы он стал более понятным. Поделитесь своими мыслями по этому поводу. – Qwerty

ответ

2

Я бы сказал, что лучший подход будет иметь только is_power_supply_on функции. Тогда, чтобы проверить, если он выключен, вы можете сделать not is_power_supply_on(dictionary).

Это может быть даже лямбда (при условии, что state является ключом к административное состояние) ::

is_power_supply_on = lambda mydict: mydict['state'].lower() == 'ok' 

Проблема с первым подходом заключается в том, что, как вы говорите, он расторгает коды.

Проблемы второго подхода является то, что, в лучшем случае, вы сохраните два символа по сравнению с not (если вы используете 0 или 1 для on_or_off), и если вы используете более идиоматический подход (например, тест on=True или on_or_off="off") you end up using more characters. Further, it results in slower and more complicated code since you need to do an if` .

проблема с третьим подходом в большинстве случаев вы будете также, вероятно, будете тратить символы по сравнению с просто получить значение dict ключа вручную.

+0

Да, это похоже идеал. Избегает дублирования кода первого подхода и избегает необходимости создавать какое-то перечислимое состояние «power state», как вам нужно для второго и третьего подходов. – Kevin

+0

TheBlackCat, спасибо! У вас есть рекомендация для книги по написанию многоразового кода? – Qwerty

+0

Возможно, «Идиоматический питон». – TheBlackCat

0

Даже если это решение не в ваших предложениях, я думаю, самый питонический способ создания геттеров - использовать свойства.Как это, вы будете в состоянии знать, является ли источник питания включен или выключен, но пользователь будет использовать это свойство, как это было простым членом класса:

@property 
def state(self): 
    # Here, get whether the power supply is on or off 
    # and put it in value 
    return value 

Кроме того, вы можете создать две константы класса, PowerSupply.on = True и PowerSupply.off = False, что позволит сделать код легче понять

0

общий Pythonic стиль не повторять себя излишне, поэтому, безусловно, первый метод кажется бессмысленным, потому что это на самом деле заблуждение следовать (вы должны заметить, является ли он или выключен)

Я бы больше тяготел к

get_power_supply_admin_state(dictionary) 
    gets the admin state from dictionary 
    return value 

И, если я читаю это правильно, вы можете пойти еще дальше.

power_supply_on(dictionary) 
    return the admin state from dictionary == turned on 

Это будет оценивать Истина, если это на и ложь в противном случае, создавая самый простой тест, потому что тогда вы можете запустить

if power_supply_on(dictionary): 
0

Это более Pythonic хранить словарь в классе:

class PowerSupply(object): 
    def __init__(self): 
     self.state = {'admin': 'FAIL'} 

    def turn_on(self): 
     self.state['admin'] = 'OK' 

    def is_on(self): 
     return self.state['admin'] == 'OK' 

(при необходимости необходимо добавить другие методы)

Тогда вы можете использовать его следующим образом:

ps = PowerSupply() 
if not ps.is_on(): 
    # send an alert! 
0
result = is_power_supply_off(state) 
result = is_power_supply_on(state) 
result = not is_power_supply_on(state) # alternatively, two functions are certainly not needed 

Я сильно предпочитают этот вид имен для удобочитаемости. Давайте просто рассмотрим альтернативы, а не в определении функции, но где используется функция.

result = is_power_supply_on_or_off(state, True) 
    pass 
result = is_power_supply_on_or_off(state, False) 
    pass 
if get_power_supply_admin_state(state): 
    pass 
if not get_power_supply_admin_state(state): 
    pass 

Все эти коды требует карту того, что True и False означает в этом контексте. И, честно говоря, это не так понятно. Во многих встроенных системах 0 означает правдивое значение. Что делать, если эта функция анализирует вывод из системной команды? Значение 0 (ложь) является индикатором правильного состояния/исполнения. В результате интуитивно понятный True означает, что OK не всегда действует. Поэтому я настоятельно советю для первого варианта - точно названной функции.

Очевидно, что у вас будет какая-то частная функция, например _get_power_supply_state_value(). Обе функции будут вызывать это и манипулировать его выходом. Но точка - она ​​будет скрыта внутри модуля, который знает, что означает, что рассматривает состояние питания. Деталь реализации и пользователи API не нуждаются в этом.

Смежные вопросы