获取python变量的名称(从父命名空间)

获取python变量的名称(从父命名空间),python,globals,Python,Globals,我需要获取python中变量的名称。 例如: task = EmailTask() 我需要将“任务”映射到实际对象 这方面的用例如下所示: 我正在构建一个ETL工具,它将有许多可重用的通用任务,而不是用户为他创建的每个实例提供额外的任务名,我将使用用户选择的变量名。此变量名仅用于日志记录目的。用例示例: process_task = MoveDataTask() email_task = EmailTask() job = Job( tasks: [process_task, ema

我需要获取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”(以上是一个示例)

这种方法是否还有其他缺陷/问题/遗漏的地方?

创建助手函数(可能是为了命名空间而在专用模块中创建),并将它们传递给作业:

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()
创建助手函数(可能是为了命名空间而在专用模块中)并将其传递给作业:

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()

为什么不保存所有的魔法,并在构造函数中使用字符串名称呢
MoveDataTask(“process\u task”)
我正试图使这一过程尽可能简单、快速地构建一个新作业。分配给任务的变量已经选择了一个好名字,我想我应该已经使用了。依我看,事情不是这样做的。变量名不应该以这种方式有意义。即使你能做到这一点,如果其他人需要理解你的代码,他们也会对此感到困惑。-您应该为每个任务添加一个
getName()
方法,以便每个任务对象都知道自己的名称并可以返回它。如果名称与对象一一不匹配,则应按照@NedBatchelder的建议执行,并在创建对象时将名称传递给对象。对象上的
getName()
方法将返回该值。这是解决此类问题的标准答案。为什么不保存所有的魔法,并在构造函数中使用字符串名称呢
MoveDataTask(“process\u task”)
我正试图使这一过程尽可能简单、快速地构建一个新作业。分配给任务的变量已经选择了一个好名字,我想我应该已经使用了。依我看,事情不是这样做的。变量名不应该以这种方式有意义。即使你能做到这一点,如果其他人需要理解你的代码,他们也会对此感到困惑。-您应该为每个任务添加一个
getName()
方法,以便每个任务对象都知道自己的名称并可以返回它。如果名称与对象一一不匹配,则应按照@NedBatchelder的建议执行,并在创建对象时将名称传递给对象。对象上的
getName()
方法将返回该值。这是对此类问题的一个非常标准的答案。我走这条路的唯一原因是让用户创建一个新的“作业”变得尽可能快和容易(使用尽可能少的代码)。您的方法不起作用,因为太多的样板代码。我看不出这个答案完全解决了OPs问题。这并没有为他的任务提供可打印的名称,我相信这是他所要求的。这是你的项目,你知道得最好。如果你把事情命名为“报告”,而不是“工作”,那么可能就不会那么混乱了。编辑:我出局了,代码末尾有一行job.start()愚弄了我。我沿着这条路走下去的唯一原因是让用户创建一个新的“作业”尽可能快而容易(代码越少越好)。您的方法不起作用,因为太多的样板代码。我看不出这个答案完全解决了OPs问题。这并没有为他的任务提供可打印的名称,我相信这是他所要求的。这是你的项目,你知道得最好。如果你把事情命名为“报告”,而不是“工作”,那么可能就不会那么混乱了。编辑:我退出了,代码末尾有一行job.start()愚弄了我。