gpt4 book ai didi

python - 是否可以确定一个函数是在另一个函数的主体中调用还是作为函数的参数调用?

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:31 27 4
gpt4 key购买 nike

假设我们有一个 Python 函数:

def func():
# if called in the body of another function, do something
# if called as argument to a function, do something different
pass

func() 可以在另一个函数体中调用:

def funcA():
func()

func() 也可以作为函数的参数调用:

def funcB(arg1):
pass

def funcC(**kwargs):
pass

funcB(func())
funcC(kwarg1=func())

有没有办法在 func() 的主体中区分这两种情况?

编辑。这是我的用例。我想使用 Python 作为基于规则的 3D 模型生成语言。每个规则都是一个小的 Python 函数。每个后续规则都会改进模型并添加其他详细信息。 Here是一个示例规则集。 Here是描述规则集如何工作的教程。我的规则语言模仿一种称为 CGA 形状语法的规则语言。如果这个 StackExchange 问题可以解决,我的规则语言可以大大简化。

编辑2。代码补丁对我来说也足够了。例如,在另一个函数的主体中调用 func 的所有情况都被替换为类似的东西

call_function_on_the_right()>>func()

最佳答案

其他人已经指出这可能不是一个好主意。您可以通过要求使用例如来实现相同的目的。 funct() 在顶层和 funca() 作为参数时,两者都可以调用相同的 func() 并使用关键字参数指定您是否例如,在顶层或在争论中。但我不是来争论这是否是个好主意,我是来回答问题的。

这可能吗?可能是。

那你会怎么做呢?好吧,首先要知道的是,您可以使用 inspect.stack() 来获取有关从中调用您的上下文的信息。

您可以找出从哪一行调用并阅读源文件以查看该函数是如何在该行上调用的。然而,这有两个问题。

  1. 源文件可能已被修改并提供错误信息。
  2. 如果你执行 func(func()) 会怎样?它在同一行上以两种方式调用!

要获得准确的信息,您应该查看堆栈中的框架对象。它们有一个包含字节码的 f_code 成员和一个包含最后一条指令位置的 f_lasti 成员。使用这些你应该能够弄清楚当前正在调用该行上的哪个函数以及返回值的去向。不过,您必须为框架解析整个字节码(查看 dis 模块),并跟踪解释器使用的内部堆栈以查看返回值的去向。

现在,我不是 100% 确定它会起作用,但我不明白为什么它不会起作用。我能看到的唯一可能“出错”的是,如果跟踪返回值被证明太难了。但由于您只需要在一行代码的持续时间内跟踪它,所以据我所知,实际上不应该有任何“无法”处理的结构。

我没有说这很容易,只是说它有可能。 :)

关于python - 是否可以确定一个函数是在另一个函数的主体中调用还是作为函数的参数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26316160/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com