【问题标题】:How to pass a const queue to a function?如何将 const 队列传递给函数?
【发布时间】:2022-01-07 00:12:54
【问题描述】:

我是个 C 人。我知道 python denounces const 关键字支持“我们是成年人,我们彼此信任”。

现在我需要通知一些 python 线程一些消息和decided 使用队列。消息是长度不超过 1024 个字符的字符串。我觉得这些线程可以为调用线程甚至为它们自己更改这些消息是荒谬的。

如何预防?还是已经有了?

【问题讨论】:

  • 在某些情况下,我会在发送之前创建此类消息的(深层)副本。尤其是当系统的多个端有可能修改同一个数据对象并因此产生不希望的副作用时。但是,假设这种情况在 20,000 LoC 中发生一次。但是你需要密切关注它......
  • 消息是什么? Python 有很多不可变的方法,所有原始内置函数都是不可变的,一些容器(如 tuples、namedtuples 和frozensets)是不可变的,还有几个实用程序(如dataclass)提供冻结类型。但最终,如果您不想改变某些东西,就不要改变它。
  • @MisterMiyagi 这听起来比深拷贝要干净得多。我更新了消息是短字符串的问题。这是一个聊天应用程序。

标签: python multithreading constants


【解决方案1】:

TLDR:将您的数据转换为不可变类型之一,或创建冻结类型。数字和字符串等原始数据始终是不可变的。


Python 提供了几种构造不可变或准不可变值的方法。

  • 数字、字符串等基元始终是不可变的。
  • 容器提供一些不可变类型,例如 tuplefrozenset 作为不可变序列或集合。
  • 可以将自定义类型定义为不可变类型,例如使用NamedTuplefrozen dataclass

理想情况下,旨在共享的数据应直接使用不可变类型构造。如果无法做到这一点,请在共享之前数据从可变类型转换为不可变类型。

>>> # strings are always immutable
>>> data = "Hello World!"
>>> data[:5] = "Howdy"
....
TypeError: 'str' object does not support item assignment
>>> # sequence are mutable or immutable
>>> data = ["Hello", "World"]
>>> idata = tuple(data)  # create immutable from mutable sequence
>>> data[0] = "Howdy"
>>> idata[0] = "Howdy"
...
TypeError: 'tuple' object does not support item assignment
>>> data, idata
(['Howdy', 'World'], ('Hello', 'World'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多