Получение имен переменных Python (из родительского пространства имен) - PullRequest
2 голосов
/ 06 июля 2019

Мне нужно получить имя переменной в Python. Например:

task = EmailTask()

Мне нужно отобразить «задачу» на фактический объект.

Вариант использования для этого следующий: Я создаю инструмент ETL, который будет иметь много общих задач многократного использования, и вместо того, чтобы пользователь предоставил дополнительное имя задачи для каждого создаваемого им экземпляра, я буду использовать имя переменной, выбранное пользователем. Это имя переменной используется только для целей ведения журнала. Пример использования:

process_task = MoveDataTask()
email_task = EmailTask()

job = Job(
    tasks: [process_task, email_task])

job.start()

Мне придется использовать globals (), поскольку задача будет объявлена ​​в родительском пространстве имен. Я понимаю, что у меня будет несколько ограничений на то, как пользователь объявляет всю «работу», в этом ему придется назначать каждую задачу на имя переменной, вместо того, чтобы делать следующее:

job = Job(
    tasks: [MoveDataTask(), EmailTask()])

Я знаю, что globals () в значительной степени дает мне то, что я хочу, но у меня есть сомнения относительно его использования, так как это немного нестандартное использование python. Также, как я понимаю, в globals () может быть несколько имен одного и того же объекта, поэтому мне нужно каким-то образом получить родительское имя ("process_task", "email_task" из приведенного выше примера).

Есть ли какие-либо другие подводные камни / проблемы / вещи, которые мне не хватает в этом подходе?

1 Ответ

0 голосов
/ 06 июля 2019

Создайте вспомогательные функции (возможно, в выделенном модуле для пространства имен) и передайте их в задание:

def process_task():
    return MoveDataTask()

def email_task():
    return EmailTask()

# ...
job.add_task(process_task)
job.add_task(email_task)

# ...
for task in job.tasks:
    task()
...