我可以阻止修改 Python 中的对象吗?

2024-06-22

我想控制全局变量(或全局范围的变量),使其在程序初始化代码中仅设置一次,然后锁定它们。

我使用 UPPER_CASE_VARIABLES 作为全局变量,但我想有一个确定的方法来不更改变量。

  • python 是否提供该(或类似)功能?
  • 如何控制全局范围的变量?

ActiveState 有一个名为Cᴏɴsᴛᴀɴᴛs ɪɴ Pʏᴛʜᴏɴ http://code.activestate.com/recipes/65207-constants-in-python由可敬的人亚历克斯·马泰利 http://en.wikipedia.org/wiki/Alex_Martelli用于创建一个const具有创建后无法反弹属性的模块。这听起来像是您正在寻找的内容,除了大写之外 - 但可以通过检查属性名称是否全部大写来添加。

当然,有决心的人可以规避这一点,但这就是 Python 的方式,并且被大多数人认为是一件“好事”。然而,为了让它变得更加困难,我建议你不要费心添加所谓的显而易见的东西__delattr__方法,因为人们可以删除名称,然后将它们添加回反弹到不同的值。

这就是我正在考虑的:

Put in const.py:

# from http://code.activestate.com/recipes/65207-constants-in-python
class _const:
    class ConstError(TypeError): pass  # Base exception class.
    class ConstCaseError(ConstError): pass

    def __setattr__(self, name, value):
        if name in self.__dict__:
            raise self.ConstError("Can't change const.%s" % name)
        if not name.isupper():
            raise self.ConstCaseError('const name %r is not all uppercase' % name)
        self.__dict__[name] = value

# Replace module entry in sys.modules[__name__] with instance of _const
# (and create additional reference to it to prevent its deletion -- see
#  https://stackoverflow.com/questions/5365562/why-is-the-value-of-name-changing-after-assignment-to-sys-modules-name)
import sys
_ref, sys.modules[__name__] = sys.modules[__name__], _const()

if __name__ == '__main__':
    import __main__  as const  # Test this module...

    try:
        const.Answer = 42  # Not OK to create mixed-case attribute name.
    except const.ConstCaseError as exc:
        print(exc)
    else:  # Test failed - no ConstCaseError exception generated.
        raise RuntimeError("Mixed-case const names should't be allowed!")

    try:
        const.ANSWER = 42  # Should be OK, all uppercase.
    except Exception as exc:
        raise RuntimeError("Defining a valid const attribute should be allowed!")
    else:  # Test succeeded - no exception generated.
        print('const.ANSWER set to %d raised no exception' % const.ANSWER)

    try:
        const.ANSWER = 17  # Not OK, attempt to change defined constant.
    except const.ConstError as exc:
        print(exc)
    else:  # Test failed - no ConstError exception generated.
        raise RuntimeError("Shouldn't be able to change const attribute!")

Output:

const name 'Answer' is not all uppercase
const.ANSWER set to 42 raised no exception
Can't change const.ANSWER
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以阻止修改 Python 中的对象吗? 的相关文章

随机推荐

  • Azure 存储模拟器无法连接到 LocalDB

    我的 Azure 存储模拟器有问题 它拒绝连接到 LocalDb 在我使用命名管道创建 ODBC 连接之前 它曾经工作得很好 发生了什么 我需要从 Mathematica 访问数据库中的数据 因此我生成了一个 ODBC 连接 ODBC 无法
  • valgrind 错误和 ucontext。为什么“使用大小为 8 的未初始化值”?

    我一直试图理解为什么 valgrind 对于这个使用 ucontexts 的小型测试程序抱怨 使用大小为 8 的未初始化值 它基本上是一个创建 n ucs ucontexts 并切换它们 max switch 次的程序 我理解 警告 客户端
  • 以编程方式获取 iPhone 的运营商信号强度

    有没有办法使用 Objective C 获取 iPhone 的运营商和 或当前信号强度 我知道如何确定是否存在数据连接 以及该连接是 Wi Fi 还是蜂窝连接 我还知道您可以手动将 iPhone 置于 现场测试 模式 方法是转到手机应用程序
  • 更改警报对话框的文本颜色

    我的应用程序中有一个用于下载音频指令的弹出窗口 我想做的是将 确定 的默认文本颜色更改为蓝色 我尝试了一些东西 但它不起作用 这是我的代码 private void showDownloadPgmPopup android app Aler
  • 如何使用 RedirectToAction 方法添加查询字符串值?

    在 asp net mvc 中 我使用以下代码 RedirectToAction myActionName 我想通过查询字符串传递一些值 我该怎么做 传递的不属于路由一部分的任何值都将用作查询字符串参数 return this Redire
  • Psycopg2:“模块”对象没有属性“连接”[重复]

    这个问题在这里已经有答案了 我正在尝试使用 psycopg2 连接到 postgres 数据库 import psycopg2 try conn psycopg2 connect dbname puppetdb user puppetdb
  • Python——发现它!牌

    我正在尝试模拟 Spot it 的牌组 使用 Python 制作卡片 对于那些不知道什么是 Spot it 的人这是一种流行的纸牌游戏 一副牌中有 55 张牌 每张牌上有 8 个随机符号 例如球 波浪等 每张牌都有 1 个与其他牌相同的符号
  • C#:如何获取字符串的第一个字符?

    第一个可以吗char通过执行以下操作可以检索字符串的 MyString ToCharArray 0 Just MyString 0 这使用了字符串 字符 http msdn microsoft com en us library syste
  • Java 中的泛型枚举

    我有一个基本的 Configuration 类 它在枚举中提供所有可能的键和相应值类型的类型 如下所示 public class Configuration public static enum Key FIRST KEY actual k
  • 如何在 Safari 中打开外部链接而不是应用程序的 UIWebView?

    我有一个Phonegap cordova 应用程序 我想在phonegap WebView中加载一些外部网页 并且我还有其他外部网页 我想在用户激活它们时在Safari中加载它们 通常 大多数人都会遇到想要在 WebView 中打开外部链接
  • Chrome DevTools 网络瀑布 - 请求之间的差距?

    我一直在对运行缓慢的 Web 应用程序进行一些重构 并设法减少请求数量和下载大小 以帮助改善这种情况 现在加载时间持续缩短 然而 在最后两个请求之前几乎没有经过任何时间 现在始终存在差距 问题 1 Chrome 网络视图中的这些 间隙 表示
  • 如何在主屏幕等视图之间切换

    如何在多个之间切换UIView正在使用一个UIViewController就像 iPhone 主屏幕一样 如果您需要澄清 请询问 请不要拒绝 使用 UIScrollView this http developer apple com iph
  • 使用 JavaScript 更改元素的 `innerHTML`

    好的 我是 JavaScript 新手 但我正在尝试更改innerHTML of a div元素 这是我的脚本不起作用 div change div 它应该可以工作 但由于某种原因没有 有什么帮助吗 而不是分配var1 to window
  • 如何通过 Get-AzureRmAppServicePlan 检索workerSize

    通过 Azure PowerShell cmdlet 创建新的 AppServicePlan 时New AzureRmAppServicePlan 预计我会添加一个WorkerSize例如小号 中号或大号 例如 appServicePlan
  • 使用前置摄像头拍摄图像,无需在android中打开相机应用程序[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 Android 手机的前置
  • 如何捕获退出 Winforms 应用程序的事件?

    如果用户想通过单击退出图标或按 ALT F4 退出应用程序 我想创建一个对话框 询问用户是否确实确定要退出 如何在应用程序实际关闭之前捕获此事件 查看关闭时 http msdn microsoft com en us library sys
  • ANDROID 上的磁场传感器校准

    我正在制作一个用作指南针的应用程序 我使用加速度计和磁场传感器来计算方位角 sensor getOrientation 我正在寻找可以提高磁场传感器精度的东西 因为我得到的精度状态是不可靠的 有人知道这件事吗 我正在寻找一些可以硬编码的东西
  • Java错误:表达式的非法开始

    我基本上正在完善 完成并尝试从 Java 初学者的参考书中编译测试代码 目标是创建一个猜谜游戏 其中目标位于 3 个连续的单元格中 我将位置保存在一个数组中 并且用户猜测单元格号 逐个细胞地摧毁目标细胞 我在这里查看了六篇关于同一错误的帖子
  • 如何获取 std::wstring 的字节大小?

    我在用std wstring作为我的 Unicode 样式字符串 现在我想得到 a 的字节大小wstring 如果我使用size 的方法wstring 我只得到字符总数 在我的wstring 但字节应该是 size 2 有没有官方的方法来获
  • 我可以阻止修改 Python 中的对象吗?

    我想控制全局变量 或全局范围的变量 使其在程序初始化代码中仅设置一次 然后锁定它们 我使用 UPPER CASE VARIABLES 作为全局变量 但我想有一个确定的方法来不更改变量 python 是否提供该 或类似 功能 如何控制全局范围