如何“声明”空字节变量?

问题描述 投票:0回答:6

如何在 Python 3 中初始化(“声明”)一个空的

bytes
变量?

我正在尝试接收字节块,然后将其更改为 utf-8 字符串。 但是,我不确定如何初始化初始变量 保存整个字节序列。这个变量称为

msg
。 我无法将其初始化为
None
,因为你无法添加
bytes
NoneType
。我无法将其初始化为 unicode 字符串,因为那样 我将尝试将
bytes
添加到字符串中。 另外,随着接收程序的发展,它可能会让我陷入困境 包含仅包含部分字符的一系列字节。 我不能没有
msg
初始化,因为那样
msg
将是 赋值前引用。 以下是有问题的代码

def handleClient(conn, addr):
    print('Connection from:', addr)
    msg = ?
    while 1:
        chunk = conn.recv(1024)
        if not chunk:
            break
        msg = msg + chunk
    msg = str(msg, 'UTF-8')
    conn.close()
    print('Received:', unpack(msg))
python variables python-3.x byte variable-assignment
6个回答
90
投票

只需使用空字节串即可,

b''

但是,重复连接字符串需要多次复制字符串。可变的

bytearray
可能会更快:

msg = bytearray()  # New empty byte array
# Append data to the array
msg.extend(b"blah")
msg.extend(b"foo") 

要将字节数组解码为字符串,请使用

msg.decode(encoding='utf-8')


4
投票

bytes()
对我有用;

>>> bytes() == b''
True

2
投票

使用

msg = bytes('', encoding = 'your encoding here')

如果你想使用默认编码,只需使用

msg = b''
,但如果它不是相同的编码,这将导致整个缓冲区变得垃圾


2
投票

要分配任意长度的字节

bytes(bytearray(100))

0
投票

根据文档:

块引用 socket.recv(bufsize[, 标志]) 从套接字接收数据。返回值是一个代表接收到的数据的string。 块引用 所以,我认为 msg="" 应该可以正常工作:

>>> msg = ""
>>> msg
''
>>> len(msg)
0
>>>

0
投票

免责声明: 这个答案主要是为了回答标题本身,因为所提出的涉及实例化的解决方案不仅声明变量,而且还实例化并为其赋值(实际上定义它)。


自 3.5 起,您现在只能在 Python 中声明变量及其类型,并使用注释将 类型提示 添加到代码中。

def foo():
    # The static type analysis tool will expect the variable
    # named "a" that could live in this scope to be of type
    # `bytes`.
    a: bytes

    # Rest of the function body.

但是,请记住,Python 本身不会对注释执行任何操作,也不会强制执行任何类型检查。(Python 路线图中甚至没有考虑这样的事情)。

类型检查的注释仅对第三方工具有一定用处,例如静态类型分析工具(如

MyPy
PyRight
),可以帮助您保持代码的健全性。

示例:

请注意,尽管未通过类型检查,此类示例仍被 Python 解释器接受。

© www.soinside.com 2019 - 2024. All rights reserved.