Проблема с вызовом функции, название которой переданно через параметр
Мой вопрос заключается в том, что у меня не получается сделать так, чтобы при вызове программы в методе
InputBox через системные аргументы загружались функции класса YandexDiskOperations
Так как это можно реализовать?
import sys
import yadisk
import os
import pyAesCrypt
from os import stat, remove
import random
class YandexDiskOperations():
def __init__(self):
self.get_auth()
print('n4')
def get_auth(self):
self.y = yadisk.YaDisk("94885fad3a5e407b8cda5af348597aae", "59d96c74713947b9bad0f691dffb5699")
url = self.y.get_code_url()
with open("data.txt", "rb") as token_txt:
code = token_txt
try:
response = self.y.get_token(code)
print('n1')
except yadisk.exceptions.BadRequestError:
print('n2')
sys.exit(1)
self.y.token = response.access_token
print('n3')
if self.y.check_token():
print("Токен получен")
else:
print("Срок жизни токена истек, либо введён не правильно")
def move(self, from_path, to_path):
try:
operation = self.y.move(from_path, to_path)
while True:
status = self.y.get_operation_status(operation.href)
if status == "in-progress":
time.sleep(5)
print("Still waiting...")
elif status == "success":
print("Success")
break
else:
print("Не выполнено, ошибка: {0}".format(status))
break
except:
print('Ошибка в выполнении')
def listdir(self, path, **kwargs):
try:
operation = self.y.listdir(path)
print(operation)
except:
print('Не выполнено, ошибка')
def is_dir(self, path, **kwargs):
try:
operation = self.y.is_dir(path)
print(operation)
except:
print('Не выполнено, ошибка')
def is_file(self, path, **kwargs):
try:
operation = self.y.is_file(path)
print(operation)
except:
print('Не выпонено, ошибка')
class InputBox():
def __init__(self):
YandexDiskOperations.self.locals()[sys.argv[1]](sys.argv[2], sys.argv[3])
if __name__ == '__main__':
print('''
Это приложение работает через код подтверждения.
Для начала работы перейдите по ссылке:
https://oauth.yandex.ru/authorize?response_type=code&client_id=94885fad3a5e407b8cda5af348597aae
После - создайте папку token.txt и вствьте его туда
''')
start = YandexDiskOperations()
location = InputBox()
Ответы (2 шт):
Автор решения: Andrii Shyrokov
→ Ссылка
Сделайте так:
class YandexDiskOperations:
...
def additional_func(self):
locals()[sys.argv[1]](sys.argv[2], sys.argv[3])
class InputBox():
def __init__(self):
self.smth = YandexDiskOperations()
def another_func(self):
self.smth.additional_func()
Автор решения: Никита Разуваев
→ Ссылка
На самом деле то решение не является верным, потому, что объекты внутри классов имеют другую структуру, и если попробовать вызвать функцию locals() внутри класса -
будет виден лишь атрибут self.
Оптимальное решение проблемы - создать словарь, содержащий в себе в ключе название функции, а в значении ссылку на метод класса.
class YandexDiskOperations():
def __init__(self):
self.get_auth()
self.dict_func = {'copy': self.copy, 'download': self.download}
def additional_func(self):
# print(locals())
# locals()[sys.argv[1]](sys.argv[2], sys.argv[3])
self.dict_func[sys.argv[1]](sys.argv[2], sys.argv[3])