在 Python 中临时更改变量的值

2024-03-23

Python 3.4 提供了这个简洁的工具来临时重定向 stdout:

# From https://docs.python.org/3.4/library/contextlib.html#contextlib.redirect_stdout
with redirect_stdout(sys.stderr):
    help(pow)

The code http://hg.python.org/cpython/file/3.4/Lib/contextlib.py并不是超级复杂,但我不想一遍又一遍地写它,特别是因为已经对其进行了一些思考以使其可重入:

class redirect_stdout:
    def __init__(self, new_target):
        self._new_target = new_target
        # We use a list of old targets to make this CM re-entrant
        self._old_targets = []

    def __enter__(self):
        self._old_targets.append(sys.stdout)
        sys.stdout = self._new_target
        return self._new_target

    def __exit__(self, exctype, excinst, exctb):
        sys.stdout = self._old_targets.pop()

我想知道是否有通用的方法来使用with临时改变变量值的语句。另外两个用例来自sys are sys.stderr and sys.excepthook.

在完美的世界中,这样的事情会起作用:

foo = 10
with 20 as foo:
    print(foo) # 20
print (foo) # 10

我怀疑我们能否做到这一点,但也许这样的事情是可能的:

foo = 10
with temporary_set('foo', 20):
    print(foo) # 20
print (foo) # 10

我可以通过扎根来解决这个问题globals(),但这不是任何人都会选择使用的。

更新:虽然我认为我的“foo = 10”示例阐明了我想要做的事情,但它们没有传达实际的用例。这里有两个:

  1. 重定向 stderr,很像redirect_stdout
  2. 暂时更改sys.excepthook。我以交互方式进行了大量开发,当我向 excepthook 添加某些内容(通过将原始函数包装在我自己的函数中,例如使用日志记录模块记录异常)时,我通常希望它在某个时刻被删除。这样我就不会有越来越多的函数副本自我包装。这个问题 https://stackoverflow.com/questions/8415463/adding-function-to-sys-excepthook/面临一个密切相关的问题。

我知道这个问题有点老了,但当我遇到同样的问题时,这是我的解决方案:

class test_context_manager():
    def __init__(self, old_object, new_object):
        self.new = new_object
        self.old = old_object
        self.old_code = eval(old_object)
    def __enter__(self):
        globals()[self.old] = self.new
    def __exit__(self, type, value, traceback):
        globals()[self.old] = self.old_code

它并不漂亮,因为它大量使用全局变量,但它似乎有效。

例如:

x = 5
print(x)
with test_context_manager("x", 7):
    print(x)

print(x)

Result:

5
7
5

或具有以下功能:

def func1():
    print("hi")

def func2():
    print("bye")

x = 5
func1()
with test_context_manager("func1", func2):
    func1()

func1()

Result:

hi
bye
hi
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中临时更改变量的值 的相关文章

随机推荐

  • 防止多次点击按钮

    我有以下 jQuery 代码来防止双击按钮 效果很好 我在用Page ClientValidate 确保仅当页面有效时才阻止双击 如果存在验证错误 则不应设置标志 因为没有启动到服务器的回发 有没有更好的方法来防止在页面加载回来之前第二次单
  • 无法创建新的 Chrome 远程会话

    我正在尝试使用 Selenium Grid 启动新的 Chrome 浏览器 但最终出现以下错误 无法创建新的远程会话 所需功能 功能 browserName chrome version 55 0 2 platform WINDOWS 所需
  • 如何重命名 Excel 工作表?

    我有一个场景 我想更改电子表格中工作表的名称 我尝试使用创建电子表格ss Workbook 我认为这是用名为 Sheet 的工作表创建电子表格 我尝试使用以下格式更改工作表的名称 ss sheet ss get sheet by name
  • Realm 将数据追加到类型 List

    我正在尝试遍历数据并将其保存在我的模型中 但是无论我做什么 我都会收到以下错误 Can t mutate a persisted array outside of a write transaction 我究竟做错了什么 我将每场比赛附加到
  • “文本”和 new String(“文本”) 有什么区别?

    下面这两个陈述有什么区别 String s text String s new String text new String text 显式创建一个新的且引用不同的实例String目的 String s text 可以重用来自的实例字符串常
  • Coldfusion autosuggest 不适用于字符串中间的建议

    对于我的自动建议 我使用下面的代码 输入时 它只查看字符串的开头 例如 如果我输入 abcd 它会附带建议 abcde 这很好 但它没有做什么 如果我输入 def 并且在数据库中我有一个字符串 abcdefg 那么它不会出现在自动建议中 在
  • 在 CellTable 中添加并排序的行

    我想在添加新行时对 CellTable 中的行进行排序 为了标记 UI 我使用 UIBinder
  • 如何在浏览器中读取本地文本文件?

    我试图通过创建一个函数来实现一个简单的文本文件阅读器 该函数接受文件的路径并将每行文本转换为字符数组 但它不起作用 function readTextFile var rawFile new XMLHttpRequest rawFile o
  • 在 php 中,我应该在通常返回数组的方法中返回 false、null 或空数组吗?

    我发现了一些对此的回应 但没有一个与 PHP 这是一种极其弱类型的语言 有关 关于PHP 在通常会返回数组但发生失败的方法中返回 false null 或空数组是否合适 换句话说 如果另一个开发人员加入我的项目 他们会期望看到什么 数组是事
  • 更新以前的会话数组 Laravel

    我有一个问题 如何更新我以前的数组 我的代码目前发生的情况是它只是添加新的会话数组 而不是更新声明的密钥 这是我的代码 foreach items updated as key gt added if id added item id ne
  • Mat-table 的行具有不同的子行数

    尝试使用mat table指令 例如 matRowDef and multiTemplateDataRows构建一个表 其中每行可以有不同数量的子行 示例界面如下所示 interface ReportCard student string
  • Android:标题栏和 ActionBar 有什么区别

    我无法判断它们是否是同一件事 而且它们似乎有不同的方法来删除它们 但我不确定这些是否只是做同一件事的多种方法 那么有区别吗 如果有区别的话是什么 Ref https developer android com reference andro
  • 捕获粘贴输入

    我正在寻找一种方法来清理粘贴到浏览器中的输入 这可以用 jQuery 实现吗 到目前为止我已经想出了这个 this live pasteEventName function e this is where i would like to s
  • Go:JSON 封送错误

    我正在 Go 中构建 JSON API 我想以 json 形式返回错误响应 响应示例 error Invalid request syntax 我认为我可以创建一个实现错误接口的包装结构 然后使用 Go 的 json 封送拆收器作为获取错误
  • Express 和 Redis 会话的过期时间

    我正在使用express和redis来使会话在我的系统上保持活动状态 我在设置 sessionCookie 上的 maxAge 时遇到一些问题 默认情况下 我读到的时间是 24 小时 但这对于保持其存活来说是很长的时间 我想设置大约 30
  • WordPress 按标题中的最后一个单词排序

    我有一个自定义帖子类型 员工 我需要让它在页面上按姓氏字母顺序显示员工 我知道解决方法是使用自定义元框并将名字和姓氏分成两个字段 但我试图避免这种情况 因为这看起来很黑客 不像仅使用标题字段那么干净 我有一个短代码 它将显示带有请求的员工
  • 使用 CSplitterWnd 在 CChildFrame 中创建多个视图

    我正在使用 MFC MDI 我需要创建如下视图 我的 ChildWnd 分为两部分 它们是LeftView CView 和RightView CScrollView LeftView 分为两部分 TreeView 和 FormView 我怎
  • Asp .NET 按钮 - OnClientClick="return function()" 与 OnClientClick="function()"

    在 asp net 用户控件中 我有一个按钮
  • 如何获取德威远程的 URL

    我希望能够获得像这样的 URLhttps github com user repo git给定一个远程名称 例如origin 到目前为止 我只设法获取提交哈希 gt gt gt from dulwich import porcelain g
  • 在 Python 中临时更改变量的值

    Python 3 4 提供了这个简洁的工具来临时重定向 stdout From https docs python org 3 4 library contextlib html contextlib redirect stdout wit