【问题标题】:Python: Can you dynamically get the amount of variables a function is going to return into?Python:你能动态获取函数要返回的变量数量吗?
【发布时间】:2019-11-06 19:24:09
【问题描述】:

我通过将所有/大部分逻辑移植到 Python 和其他各种语言来编写的实用程序系统的一部分我的 AcecoolLib 包包含一个简单但非常有用的帮助程序......一个名为 ENUM 的函数。

它具有许多有用的功能,例如自动创建枚举映射、扩展或反向映射(如果您将映射分配给的不仅仅是值)等等。

它可以创建动态生成函数名称的映射,它可以在枚举和语言的文本或字符串标识符之间创建简单的映射,等等。

函数声明也很简单:

def ENUM( _count = None, *_maps ):

它有一个额外的助手...这里:https://www.dropbox.com/s/6gzi44i7dh58v61/dynamic_properties_accessorfuncs_and_more.py?dl=0

另一个没有使用。 ENUM_MAP 是,但另一个不是。

无论如何,在我开始讨论等等之前,问题是:

如何计算函数之外的返回变量...即:

ENUM_EXAMPLE_A, ENUM_EXAMPLE_B, ENUM_EXAMPLE_C, ENUM_LIST_EXAMPLE, MAP_ENUM_EXAMPLE = ENUM( None, [ '#example_a', '#example_b', '#example_c' ] )

List 是0 = 0, 1 = 1, 2 = 2 或其他东西的简单列表。 ,然后地图链接为[ 0 = '#example_a', 1 = '#example_b', etc.. ],然后[ '#example_a' = 0, etc.. ] 用于反向...或类似的东西。

还有其他高级用例,不确定我是否在上面的文件中具有这些功能,但无论如何...我试图简单地计算返回变量...并获取名称。

我知道有可能读取执行调用的行...读取文件,获取行,将其拆分并执行所有这些操作...但我希望存在某些东西无需在默认的 Python 系统中从头开始编写代码...

简而言之:我想去掉ENUM( _count, *_maps ) 的第一个参数,以便只使用可选的*_maps。因此,如果我调用:ENUM_A, ENUM_B, ENUM_C, LIST_ENUMS = ENUM( );,它将检测 4 个输出返回,并获取它们的名称,以便我可以查看最后一个是否包含与第一个样式不同的某些文本......即,如果他们想要列表,等等......如果他们添加地图,然后添加可选列表等......我可以倒数 n _maps 来找到列表 arg,或者不......

我知道这可能没有必要,但我希望它简单而动态,所以如果我将一个新枚举添加到一个巨大的列表中,我不必添加数字(尽管对于那些我使用地图的人这意味着无论如何我都必须添加一个条目)...

无论哪种方式 - 我知道在 Lua 中,使用内置函数很容易做到这一点。我希望 Python 也有内置函数来轻松获取数据。

谢谢!

【问题讨论】:

  • 快速评论 - 简化“询问”...
  • 快速评论 - 如果我不必重写它,因为按错键会删除所有内容....我想创建 A, B, C = ENUM( );它返回 0, 1, 2 到 A, B, C 中,或多或少。或:A, B, C, LIST_ABC 并返回 0, 1, 2, [ 0 = 0, 1 = 1 2 = 2 ],或 A, B, C, LIST_ABC, MAP_ABC, MAPR_ABC = ENUM( { '#a' , '#b', '#c' } ) 并返回 0, 1, 2, [ 0 = 0, 1 = 1 2 = 2 ], [ 0 = '#a', 1 = '#b' 2 = ' #c' ], [ '#a = 0', '#b' = 1 '#c' = 2 ] ----- IE:对于包含 _maps 的时代,这很容易。但是如果使用(),我想计算调用者期望多少个args,并命名
  • 调用者需要多少个 args,以及 args 的名称作为字符串 / 文本......当有人在枚举到列表之间转换时,如果他们甚至想要一个列表或只是枚举等......对于地图,它会让我看看他们是否想要一个列表等......简而言之,它会让新开发人员更有用和更容易使用(我教其他语言并正在尝试扩展我的知识,总是。).. -- -- 该评论删除了所有内容,然后不得不重新输入并且无法再编辑。房间也用完了……最后一部分先……
  • 如果您有更多细节要添加,请将它们放在问题中,而不是 cmets。
  • 您能考虑转用标准的enum 模块吗?必须保持两个列表同步在您的方法中看起来有点容易出错

标签: python input count return args


【解决方案1】:

这是一个建议的答案,类似于我在 Lua 框架中可以做的......但不同的是,我的框架必须将所有文件加载到内存中(用于动态重新加载和动态更改,去到适当的位置 - 并通过组合所有内容来将数据联网,从而“避免”文件 i/o 成本 - 并且 Lua 处理表格非常好)。

简单的答案是它是可能的。我不确定在没有文件 i/o 的默认 Python 中,但是这种方法很容易工作。这个答案将在伪上下文中 - 但功能确实存在。

逻辑:

1) 使用跟踪,可以确定哪个文件/路径和哪一行,调用ENUM函数。

2) 将调用文件作为文本读取——如果您可以直接读取一行而无需处理整个文件——那么这样会更快。可能有一些图书馆可以做到这一点。在默认的 Python 中,除了基础知识之外,我没有完成大量的文件 i/o,所以我没有跟上所有最有用的事情,因为我通常将 SQL 用于存储目的,等等......

3) 对于有问题的行,将行文本拆分为 '=',即:在函数调用之前获得参数,以及函数本身.. 将其称为 _result

4)a 如果您没有结果,那么有人调用该函数而不返回任何内容 - 奇怪..

4) 在 ',' 上拆分 _result[ 0 ] 以获取每个单独的参数,并左右修剪空格 --

5) 将干净的参数组合成一个列表..

6) 处理参数 - 即:确定开发人员用来命名其枚举值的方法,并查看该样式是否从最后一个参数更改(如果没有 map )。如果是映射,则返回列表的 n 或 n*2 个元素,然后从那里开始映射变量。使用地图,地图返回被给出 - 我唯一需要动态做的是数字并确定用户是否有一个列表 arg。

注意:在 Python 中有一个非常有用且简单的机制,可以在一行代码中内联执行很多这些功能。

所有这些都是可能的,并且很容易在 Python 中创建。我不喜欢这个解决方案的一点是它需要文件 i/o——如果你的程序是从另一个程序执行的,并且没有保留在内存中,这意味着这些任务总是重复的,这使得它不太友好,而且更多昂贵的...

如果程序打开并保持打开状态,则成本会更高,而不是持续进行,从而不会那么糟糕。

因为我在所有东西中都使用 ENUM,包括运行然后关闭的快速可执行脚本 - 我不想使用文件 i/o..

但是,确实存在解决方案。我正在寻找替代品。

【讨论】:

    【解决方案2】:

    简单的答案是你不能。

    在 Python 中,当您执行 (a, b, c) = func() 时,它称为元组解包。本质上,它期望 func() 返回正好 3 个元素的 tuple(在本例中)。但是,您也可以执行a = func(),然后a 将包含一个三元素元组或func 决定返回的任何内容。无论func 是如何调用的,方法中都不知道返回值在返回后将如何处理。

    我想提供一种更 Pythonic 的方式来做你想做的事,但我不确定我是否理解 ENUM() 的目的。看起来您正在尝试创建常量,但 Python 并没有真正的常量。

    编辑:

    方法只知道作为参数传入的内容。如果您想要某种 ENUM 到值的映射,那么最好的等价物是 dict。然后,您可以有一个方法,采用 ENUM('A', 'B', 'C') 并返回 {'A':0, 'B':1, 'C':2},然后您将使用 dict 查找来获取值。

    enum = ENUM('A', 'B', 'C')
    print(enum['A'])  # prints 0
    

    【讨论】:

    • 谢谢 - 我知道拆包并经常使用它,因为它很有用。
    • 我正在创建“常量”,但也是枚举。区别在于常数是为了保存一个值,例如数学中的常数 C,即光速。或 AU 或天文单位。这些是有用的数据位,可以按原样使用。枚举值意味着该值没有意义,除了它是不同的。枚举为变量名赋予意义。即:它允许您执行 if ( _filetype = FILETYPE_MOVIE ){...} 之类的操作,而不是执行 if _filetype = 0.. then 链接 0 到 avi、mp4、mkv 等或其他示例之类的操作。结果是代码变得更易读
    • 我希望澄清 ENUM 值和 CONSTant 的区别。常量对于变量名称和值很有用,因为它使代码更易于阅读,同时还具有数学或其他含义。枚举是一个占位符,因此您不必对难以阅读的内容进行硬编码,因为您以后可能不记得它是什么了。 -- 如果 Python 没有“真正的” const / enum 定义也没关系,但仍然可以使用它们,因为它存在的想法,并且对于创建易于维护的代码非常有帮助。
    • 另外,您的“简单答案”是否表明没有内部方法,或者您是说在 Python 中这是不可能的?如果您的意思是后者,那么总是有方法可以创建新功能,我将能够创建它 - 但我希望有一种内部方法不会像文件 i/o 那样“昂贵”地执行. - 干杯。
    • ie:因为该功能不会提供突破性的优势,除了根据数据自动生成枚举值...文件 i/o 成本太高,无法集成以我想的方式。我会尝试使用堆栈/跟踪功能,看看我是否可以找到某种类型的信息 - 但是,正如我假设你所说的,它可能默认不存在。
    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2020-01-17
    • 2015-08-17
    • 1970-01-01
    相关资源
    最近更新 更多