【问题标题】:Assignment with function or method函数或方法赋值
【发布时间】:2018-04-14 14:49:39
【问题描述】:

在 python 中,有什么方法可以使用函数或方法为变量赋值?我正在编写一个 Scheme 解释器,如果可以的话,这个过程会大大简化。这可以使用 operator 模块完成基本逻辑和数学,如下所示:

>>> operator.add(2, 3)
5

我的意思的例子

>>> operator.assign(a, 5)
>>> print(a)
5

【问题讨论】:

  • 基本变量赋值类似于x = operator.add(2, 3),但我认为这不是您的意思。您能否提供一个具有预期输出的代码行示例?
  • 无法实现 assign,因为 Python 不支持引用调用。不过,这将如何简化任何事情并不明显。你有例子吗?
  • 基本上我有一堆符号链接到字典中的函数。如果程序读取到+,那么它会在字典中查找它并提供两个参数。对于变量定义,我想为 define 做同样的事情。
  • @ayNONE 使用相同的机制——将名称映射到字典中的值。不要在其中涉及 Python 变量。

标签: python scheme variable-assignment interpreter assignment-operator


【解决方案1】:
class Sample:

    res = None

    def Add(self, x, y):
        self.res = x + y

obj = Sample()
obj.Add(2, 3)
print obj.res

您可以使用类变量,在这里执行操作并将结果存储在类变量res中。

【讨论】:

    【解决方案2】:

    我假设您将提供一个变量名来分配值。这将涉及修改调用方范围内的值 - 不建议这样做,但有一种方法可以这样做:

    示例代码:

    import inspect
    def assign(var_name, value):
        inspect.stack()[1][0].f_locals[var_name] = value
    
    try:
      print("a={}".format(a))
    except Exception as err:
      print("ERROR: {}".format(err))
    
    assign('a', 10)
    
    try:
      print("a={}".format(a))
    except Exception as err:
      print("ERROR: {}".format(err))
    

    执行输出:

    ERROR: name 'a' is not defined
    a=10
    

    【讨论】:

    • 天哪。我敢打赌,这不是解决 OP 问题的最佳方法。
    • @JohnClements 我不会打赌 :) 因为我同意你的看法。不过,它是最简单的一种。
    【解决方案3】:

    对这个功能的需求可能暗示程序设计需要重新思考。

    您没有提供任何详细信息,但可能需要单独的命名空间以防止名称冲突。

    例如,以这种方式分配的所有变量都可以存储在某种容器中,甚至可以存储在单独的模块中。不需要任何“技巧”。

    在这些警告之后,这里是一个示例。它可以(重新)评估当前模块中的任何名称。

    import sys
    
    this_module = sys.modules[__name__]
    
    def assign(name, value):
        setattr(this_module, name, value)
    
    a = 1000
    assign('b', a + 3)
    print(b)  # 1003
    

    【讨论】:

      【解决方案4】:

      您真的不想将 python 命名空间和方案命名空间混合在一起。 python 变量是解释器实现的一部分,方案变量是评估程序的一部分。你的工作是使用宿主语言中的值来表示评估程序的环境。字典可能是一个不错的选择。但是你真的想要一个定义一个名为'main'的变量的方案程序来践踏你的实现对main的定义吗?我认为不会。

      【讨论】:

        猜你喜欢
        • 2014-12-26
        • 2012-03-18
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 2018-10-21
        • 1970-01-01
        相关资源
        最近更新 更多