首页 > 编程问答 >从 python 中的字符串列表中提取 def 定义函数的标签

从 python 中的字符串列表中提取 def 定义函数的标签

时间:2024-07-21 00:19:55浏览次数:11  
标签:python function handle

我想使用 Python 中的正常 def 过程创建函数,并将标签分配给从字符串列表中提取的命名空间。如何实现这一点?

这个问题的动机:我正在创建一个与 sympy 兼容的 python 函数库,供数学家用于符号计算实验。许多函数需要初始化具有相关标签的多个对象的系统,这些标签分别由用户提供的字符串生成。为了生成这些标签,我根据用户提供的字符串构建了一个字符串列表。然后,我继续将此字符串列表中的标签分配给正在定义的各种对象,通常是通过直接更新 globals() 字典。然而,一些被定义的对象本身就是函数,这就是这个问题的原因。

一个具体的例子:一个函数应该允许用户使用他们想要的任何标签初始化变量,并同时初始化表示与这些对偶的坐标向量场的对象变量(我们在 python 中将其定义为函数)。用户应该为其变量指定标签,然后函数应该为向量场对象生成相关标签。例如,如果用户选择变量标签“x”,则该函数应自动标记创建的向量场对象“D_x”。这只是我需要实现这种构造的许多示例之一,这就是为什么在目前的一般性中提出这个问题的原因。

示例问题:给定任意字符串列表 exampleList=['label1','label2 ','label3',...] 长度为 k,以编程方式初始化

exampleList=['label1','label2','label3','label4']
def label1(arg: str):
    if len(arg)>exampleList[0]
        print('the word '+arg+' has more letters than the word '+exampleList[0])
def label2(arg: str):
    if len(arg)>exampleList[1]
        print('the word '+arg+' has more letters than the word '+exampleList[1])
# ...etc.

形式的 k def 定义函数。

如果要定义的函数仅涉及 lambda 函数内可实现的操作,则可以使用lambda 通过更新 globals() 字典来运行。例如,可以编写类似

exampleList=['label1','label2','label3']
exampleOperation= lambda j,k: len(j)-len(k)
globals().update(zip(exampleList,[lambda k:exampleOperation(j,k) for j in exampleList]))

的内容,上面的示例使用从列表 exampleList 分配的标签初始化了一些 lambda 函数。然而,我希望使用普通的 def 定义函数而不是 lambda 函数来完成类似的任务。


你可以使用 exec 函数动态定义函数。但是,直接操作 globals() 通常被认为是不好的做法,因为它可能会导致难以调试的代码。

以下是如何使用字典来保存函数并实现所需结果的方法:

def create_functions(exampleList):
  """根据提供的标签列表创建比较函数。

  Args:
    exampleList: 字符串标签列表。

  Returns:
    一个包含已创建函数的字典,其中键是标签。
  """

  functions = {}
  for i, label in enumerate(exampleList):
    def make_function(i):  # 使用闭包来捕获当前的 'i' 值
      def function(arg: str):
        if len(arg) > len(exampleList[i]):
          print(f"单词 '{arg}' 的字母比单词 '{exampleList[i]}' 多")
      return function
    functions[label] = make_function(i)
  return functions

# 示例用法
exampleList = ['label1', 'label2', 'label3', 'label4']
functions = create_functions(exampleList)

# 现在你可以通过它们的标签访问函数
functions['label1']("test")  # 这将打印出该消息,因为“test”比“label1”长
functions['label2']("a")  # 这不会打印任何内容

这个代码片段执行以下操作:

  1. create_functions(exampleList) :
  2. 它接受一个标签列表作为输入。
  3. 它创建一个空字典 functions 来存储生成的函数。
  4. 它遍历列表中的每个标签。
  5. make_function(i) : 对于每个标签,它都会定义一个嵌套函数,该函数捕获当前的索引 i 。这样做是为了避免 Python 中常见的“迟绑定闭包”问题。
  6. function(arg: str) : 这个内部函数就是你的比较函数。它将输入字符串与 exampleList 中相应索引处的标签进行比较。
  7. 生成的函数存储在 functions 字典中,其中键是标签,值是函数。

  8. 示例用法:

  9. 它调用 create_functions 来使用你的示例列表生成函数。
  10. 然后,它演示如何通过它们的标签访问和使用生成的函数。

这个方法避免了直接操作 globals() ,并提供了对已创建函数的更清晰、更有条理的管理。

标签:python,function,handle
From: 78773189

相关文章

  • 在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取
    我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用MT681614位磁性编码器通过RaspberryPi的SPI连接读取绝对角度。我有以下问题:在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?对于编码......
  • PythonW 不运行脚本。严重地
    因此,使用Windows10和Python3.6。我创建了一个.py脚本,它可以使用命令pythonmyscript.py在命令提示符下正常运行,但是当我制作该脚本的精确副本并为其赋予扩展名.pyw,并尝试使用pythonw运行它时命令pythonwmyscript.pyw,什么也没有发生......
  • 如何使用Python和Selenium模拟产品购买以获取库存信息
    我正在开发一项网络抓取服务,主要针对时尚行业。我的目标是提供有关产品的全面数据,包括库存水平。为了实现这一目标,我需要模拟购买以确定每种尺寸的产品的最大可用数量。我一直在使用Python和Selenium进行网络抓取部分,但在准确模拟购买方面面临着挑战检索股票信息的过程。......
  • 连接Python套接字的问题
    当我写“关闭”时,我试图让我的电报机器人关闭计算机。我不想将机器人连接到网站上的托管。我选择我的手机(AndroidRedmiNote10)作为托管。我在上面安装了Termux和Pydroid。我写了两个文件:main到我的电脑,client到我的手机。通过在计算机上运行这两个文件,一切正常。但是,当我在......
  • 如何修复导入 Numexpr Python 时的错误
    在Windows10Python3.7.9(IDLE)上,我成功安装了“pipinstallnumexpr”,但在“importnumexprasne”时出现错误:Traceback(最近一次调用):文件“<pyshell#21>”,第267行,位于将numexpr导入为ne文件“C:\Python379\lib\site-packages\numexpr_init_.py”......
  • 让 cpython 优化恒定条件
    我正在用Python编写需要尽可能高效运行的代码,但有时我需要深入挖掘调试语句。不要注释这些输入或输出(或者使用外部预处理器来处理代码,就像这里建议的那样Python相当于#ifdefDEBUG或这里如何在python中实现“#ifdef”?|||)我想在模块的开头定义一个变量......
  • 如何使用 for 循环在 python jupyter 笔记本中创建动态图?
    我正在学习本课关于用Python求解热方程。该课程指出,在求解热方程后,我们可以通过在循环中简单地调用pyplot.plot()来可视化解的动画图,其中下面的代码将动态绘制每次每个点的温度,从而得到一个动画情节(课程帖子中提供了动画情节的示例)。importnumpyfrommatplotlibi......
  • Python:动态爱心代码
    importrandomfrommathimportsin,cos,pi,logfromtkinterimport*CANVAS_WIDTH=640CANVAS_HEIGHT=480CANVAS_CENTER_X=CANVAS_WIDTH/2CANVAS_CENTER_Y=CANVAS_HEIGHT/2IMAGE_ENLARGE=11HEART_COLOR="#FF99CC"defcenter_......
  • 如何在 PYTHON 中查找输入数字的千位、百位、十位和个位中的数字?例如:256 有 6 个一、5
    num=int(input("Pleasegivemeanumber:"))print(num)thou=int((num//1000))print(thou)hun=int((num//100))print(hun)ten=int((num//10))print(ten)one=int((num//1))print(one)我尝试过这个,但它不起作用,我被困住了。代码几乎是正确的,但需......
  • ModuleNotFoundError:没有名为“pyaes”的模块 python 虚拟机
    在此处输入图像描述当我在启动python项目的虚拟机上构建某个工具时,几秒钟后会出现此消息。我已经尝试重新安装pyaes但无济于事。谁能帮我?非常感谢我已经尝试重新安装pyaes但无济于事,我搜索了tepyaes模块的十个路径,但我没有找到它,而我在另一台虚拟机上完成了......