我正在將一些遺留的Python2代碼遷移到Python3中,遇到了這個函式:
FRAMESTART_A = 231
FRAMETYPE_VIDEO=6
def prepMessage(self, x)。
self.nextMessage = []
bytes = []
bytes.append(FRAMESTART_A) # 幀開始。
bytes.append(FRAMETYPE_VIDEO) # addresss
for n in range(self.width)。
# 從[0, width]設定值
值=65535 *
(1.0 - (math.pow(0.5 * (math.sin(x / 2000 time.time() 1), 4))
bytes.append(value)
for n in range(50 - self.width) 。
# set bytes from [width, :] to zero.
bytes.append(0)
message = apply(struct. 包。 ["BB"/span> "H"/span>*(len(bytes)-2)] bytes)
self.nextMessage.append(message)
從概念上講,我知道這是在創建一個位元組陣列的專案,這個陣列總是50位元組長,最后一個位元組被填充為零。 在Python3中,apply()已經不存在了,所以問題出在這一行:
message = apply(struct. 包裝。 ["BB"/span> "H"/span>*(len(bytes)-2)] bytes)
閱讀檔案,看起來我可以直接使用*運算子來將函式應用于引數串列,如:
message = struct. pack(*(["BB" "H" * (len(bytes) - 2) ] bytes))
但是這產生了一個運行時錯誤:
message = struct. pack(*(["BB" "H" * (len(bytes) - 2) ] bytes))
struct.error: 要求的引數是 不是一個整數
查看 python3 struct.pack 檔案,看起來我應該得到輸入一個格式化的字串,看起來像 "BBHHHHH...",然后給它一個位元組陣列。 然而,原來的代碼是有效的! 所以我不確定message = apply(struct.pack,["BB " "H "*(len(bytes)-2)] bytes)是如何作業的,除非struct.pack在python2中的作業原理大不相同。
什么是正確的方式來移植這個向前的代碼,以獲得作業代碼?
uj5u.com熱心網友回復:
如果你想在Python 3中重新創建apply,這很容易:
def apply(func, args, kwargs=None)。
return func(*args) if kwargs is None else func(*args, **kwargs)
如果你想讓代碼在Py2或Py3上作業,只要把這個放在你的檔案頂部,以便在沒有提供代碼的時候做一個回退的apply:
try:
應用
except NameError:
def apply(func, args, kwargs=None)。
return func(*args) if kwargs is None else func(*args, **kwargs)
這就是說,無論在Py2還是Py3上,你都不太需要apply;任何時候你看到:
apply(somefunc, someargs)
像這樣,你可以把它改成:
somefunc(*someargs)
所以在這種情況下,它將是:
message = struct. pack(*["BB" "H"*(len(bytes)-2)] bytes)
或者更簡單(因為把一個東西串聯到前面并立即解包是沒有必要的,因為你可以只傳遞這一個東西并解包其余的東西而不需要額外的臨時性):
message = struct. pack("BB"/span> "H"/span>*(len(bytes)-2) *bytes)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/309342.html
標籤:
