Как перечислить набор возможных значений, используемых в службах Python? - PullRequest
0 голосов
/ 07 ноября 2018

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

Допустим, я реализовал сервис заданий в python. Это сервер, который принимает опубликованные данные, которые содержат определение задания и выполняет задание. Сервер имеет только набор заданий, которые он может выполнять, все остальное недопустимо и требует, чтобы вызывающая сторона возвратила ошибку.

JOB_TYPE_1 = "job_type_1"
JOB_TYPE_2 = "job_type_2"
JOB_TYPE_3 = "job_type_3"
VALID_JOB_TYPES = [JOB_TYPE_1, JOB_TYPE_2, JOB_TYPE_3]

def run_job(job_type, payload):
  if job_type not in VALID_JOB_TYPES:
    raise ValueError("invalid job_type value")
  elif job_type == JOB_TYPE_1:
    run_job_type_1(payload)
  elif job_type == JOB_TYPE_2:
    run_job_type_2(payload)
  elif job_type == JOB_TYPE_3:
    run_job_type_3(payload)

@get("/api/job", method=['POST'])
def accept_post():
    payload = request.json
    job_type = request.vars.get('job_type')
    run_job(job_type, payload)

Звонящий может сделать что-то вроде

payload = dict(some_key="some_value")
requests.post("https://localhost/api/job?job_type=job_type_1", json=payload)

Так что это работает. А именно это

  1. назначает значимые строки именам заданий, поэтому вызывающему не требуется доступ к перечислениям исходного кода
  2. содержит имена заданий, хранящиеся в переменных, поэтому у нас нет магических строк, лежащих вокруг исходного кода (по крайней мере, исходного кода обработки задания)
  3. проверяет, является ли тип задания действительным job_type in VALID_JOB_TYPES).

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

Я знаю, что у python есть перечисления, и я мог бы сделать что-то вроде этого

def JobType(Enum):
  JOB_TYPE_1=1
  JOB_TYPE_2=2
  JOB_TYPE_3=3

Проблема в том, что тогда

  1. У меня нет способа проверить, является ли входящее значение job_type допустимым перечислением JobType, нет оператора if job_type in JobTypes.
  2. Вызывающий мой сервис не имеет доступа к этому перечислению, поэтому он застрял либо переопределив его самостоятельно, либо отправив по волшебным номерам (т. Е. 1 для JOB_TYPE_1 и т. Д.), Чтобы указать, какую работу он хочет бежать.

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

...