2015-01-20 3 views
2

Мой проект Python имеет возможность выполнять операции в двух разных пунктах назначения, назовем их SF и LA. Каков лучший способ достичь этого?Перечисления как константы или строки

Вариант А:

destinations.py

LA = 1 
SF = 2 

example_operation.py

import destinations 
run_operation(destination=destinations.LA) 

def run_operation(destination): 
    assert destination in [destinations.LA, destinations.SF] 
    ... 

ИЛИ

Вариант Б:

example_operation.py

run_operation(destination='LA') 

def run_operation(destination): 
    assert destination in ['LA', 'SF'] 
    ... 

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

+0

Для тестирования членства набор более эффективен - 'DESTINATIONS = set (('LA', 'SF'))' then 'assert destination at DESTINATIONS'. Но где еще вам нужны эти ценности? – jonrsharpe

+0

Это очень субъективно и на самом деле не даст никаких хороших ответов. Вы могли бы объединить оба, хотя и делать 'LA = 'LA'' и' SF =' SF''. – poke

+0

@jonrsharpe Я не слишком беспокоюсь о производительности, но спасибо. «Место назначения» используется для определения адреса загрузки позже. – disambiguator

ответ

0

Поскольку это очень субъективно, я избегу комментировать, какой путь будет лучше. Вы можете попытаться утверждать из точки производительности (целые числа быстрее, чем строки, но переменные запросы медленнее, чем константы?) Или из представления завершения кода (редакторы могут автоматически заполнять переменные) или расширяемость (вы можете легко использовать новая строка для чего-то нового), но, в конце концов, это не имеет большого значения: это в основном личные предпочтения.

Что я хочу попытаться прокомментировать, однако, вопрос валидации: как проверить такие аргументы? Мой обычный ответ на это: Не надо.

Python обычно используется без многих отказоустойчивых сейфов. Например, у Python нет истинных частных членов, а большие части stdlib даже не скрывают полностью их внутренности. Если вы хотите, вы можете использовать эти внутренние элементы, возиться со всеми вещами, но если что-то ломается, это ваша проблема. Так часто, вы просто ожидаете, что пользователи правильно используют ваш код: если они передают параметр, который ваша функция не ожидает, значит, что-то не получится. Конечно, неплохо иметь какую-то проверку, но вам, как правило, не нужно ставить утверждения везде.

+0

Цените свой ответ. Я постараюсь найти хорошее место для проверки и сделать это только один раз. – disambiguator

+0

Чтобы добавить ответ, кажется, что не существует одного предпочтительного способа сделать это во всей стандартной библиотеке (например, '' w'' параметр 'open()' vs 'subprocess.PIPE' и т. Д.). –

+0

Кроме того, очень хороший ответ (объяснение новых функций в py3.4) можно найти здесь [http://stackoverflow.com/questions/36932/how-can-i-represent-an-enum-in- python? rq = 1) –

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