0

Всем добрый день! А подскажите пожалуйста, как в python`е или в общем заменить следующее:

    if sys.argv[1] == "restart_ca":
        client = JsonClient(str(sys.argv[2]), 8081)
        client.connect()
        ...

    elif sys.argv[1] == "stop_ca":
        client = JsonClient(str(sys.argv[2]), 8081)
        client.connect()
       ...

    elif sys.argv[1] == "start_ca":
        client = JsonClient(str(sys.argv[2]), 8081)
        client.connect()
        ...

    elif sys.argv[1] == 'set_reg_key_net_int':
        client = JsonClient(str(sys.argv[2]), 8081)
        client.connect()
       ...

sys.argv[1] - это передаваемый метод через аргумент

И таких проверок в программе намечается очень много( Есть ли способ упростить такой сценарий? Подскажите пожалуйста.

Vorobey.A
  • 745
  • В итоге выполняется один и тот же код. Зачем проверять тогда? –  Nov 13 '16 at 12:23
  • @Other там где троеточие - выполняется разный код. Просто для каждого из методов происходит подключение к сокету - и ему отправляется json объект с нужным методом – Vorobey.A Nov 13 '16 at 12:26
  • Тогда вынесете повторяющийся код вне блоков. –  Nov 13 '16 at 12:27
  • 1
    Проблема данного вопроса заключается не в этом. Это то я и перенесу и так. Я не знаю как можно заменить многочисленное использование if. У меня в программе будет много разных методов - и каждый раз при запуске программы - она через эти if`ы проверяет соответствует ли передаваемый метод условию и выполянет необходимый код. Я бы хотел упростить это как-то, но пока не понимаю как – Vorobey.A Nov 13 '16 at 12:32
  • Зачем делать по другому? Это же обычное ветвление. – Мистер Фикс Nov 13 '16 at 12:35
  • Если много, то можно сделать ветвление через список. Но я не совсем уверен, что в данном случае это будет лучше. – Мистер Фикс Nov 13 '16 at 12:36
  • 2
  • Ну поддерживать это очень не удобно, мне кажется( И интересно есть ли способ облегчить – Vorobey.A Nov 13 '16 at 12:37
  • 1
    Ну да, или через словарь. – Мистер Фикс Nov 13 '16 at 12:38
  • 1
    А как насчёт этого: https://repl.it/EWaJ/0 ? –  Nov 13 '16 at 12:39
  • Круто, спасибо Вам!) Попробую через словари как советует Виктор и Other!) – Vorobey.A Nov 13 '16 at 12:43

3 Answers3

2

Решил следующим образом:

def stop_service():
    pass

def restart_service():
    pass

def start_service():
    pass

def set_reg_key():
    pass

def disable_agent_adapter_net_int():
    pass

def enable_agent_adapter_net_int():
    pass

method = {
    "stop-service": stop_service,
    "restart-service": restart_service,
    "start-service": start_service,
    "set-reg-key": set_reg_key,
    "disable-agent-adapter-net-int": disable_agent_adapter_net_int,
    "enable-agent-adapter-net-int": enable_agent_adapter_net_int
}

method["stop-service"]()

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

Vorobey.A
  • 745
1

Можно использовать словарь, в частности, если есть соответствующие функции (типа restart_ca, stop_ca) в глобальном пространстве имён:

command_name = sys.argv[1] # get the command name
command = globals()[command_name] # find the command
command() # run the command

Возможно уже существует модуль, который помогает создавать приложения, принимающие аргументы с командной строки (типа click), где подобная функция уже встроена. К примеру с помощью декоратора команды можно регистрировать:

@command
def start_ca():
    ...

Если функции/методы с заданными именами определены для другого объекта—обычный экземпляр класса или в частности другой модуль:

command = getattr(obj, command_name)
jfs
  • 52,361
0
class Source1:
    def restart_ca():
        return JsonClient(str(sys.argv[2]), 8081)
    def stop_ca():
        return JsonClient(str(sys.argv[2]), 8081)
    def start_ca():
        return JsonClient(str(sys.argv[2]), 8081)

def checker(argv, source=Source1):
    try:
        return getattr(source, argv)
    except AttributeError:
        return None


assert checker(sys.argv[1])
vadim vaduxa
  • 8,897
  • Пожалуйста, постарайтесь писать более развернутые ответы. Уверен, автор вопроса был бы благодарен за ваш экспертный комментарий к приведенному выше коду. – Nicolas Chabanovsky Nov 14 '16 at 05:57