Использование аргумента командной строки для вызова метода класса - PullRequest
0 голосов
/ 30 июня 2018

Аплоги, если у меня неверная терминология; Я все еще изучаю основы Python. Мне не удалось решить эту проблему в Google, вероятно, в значительной степени из-за того, что я не знаю терминологию ..

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

Возьмем, к примеру, mute_on в качестве функции, которую я хочу вызвать. Я запускаю скрипт с функцией / методом в аргументе, например:

python3 ./myscript.py mute_on

Я предполагаю, что мы импортируем sys (?), Определим класс и функцию и создадим соответствующий объект из класса:

import sys

class TelnetAVR(PioneerDevice):

    def mute_on(self, mute):
        self.telnet_command("MO")

mypioneer = PioneerDevice('Pioneer AVR', '192.168.2.89', 8102, 10) 

... и, наконец, я хотел бы, чтобы аргумент командной строки вызывал метод / функцию - вместо того, чтобы вызывать его явно как:

mypioneer.mute_volume()

.. Я хочу использовать arg ( sys.argv [1] ) для динамического вызова функции, например:

mypioneer.{sys.argv[1]}()

Есть идеи, добрые люди? Меня автоматически сослали на Что такое getattr () и как мне его использовать? , но я понятия не имею, как эта информация может мне помочь.

Я попытался установить cmnd = 'turn_off' , а затем произошла ошибка ...;

getattr(mypioneer, str(cmnd))
getattr(mypioneer, cmnd) 

Спасибо!

1 Ответ

0 голосов
/ 30 июня 2018

Этот ответ кажется немного базовым, но я не могу пожаловаться на его эффективность;

mypioneer = PioneerDevice('Pioneer AVR', '192.168.2.89', 8102, 10)     
exp = 'mypioneer.' + sys.argv[1] + '()'
print('Executing: ' + exp  )
exec(exp)

Я отказался от блокировки для изящного ответа и просто сконструировал строку, которую я хотел выполнить (exp), основываясь на аргументе командной строки. Прекрасно работает .. Home Assistant может использовать тот же сценарий для вызова 50 элементов управления telnet через мой Pioneer AVR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...