2015-10-27 27 views
4

我的腳本編寫由大塊大塊的文件,使用預先生成的數據模式:「預期類型‘聯盟[海峽,字節組]’了‘詮釋’,而不是」在寫方法警告

# Data pattern generator  
def get_random_chunk_pattern(): 
      return ''.join(random.choice(ascii_uppercase + digits + ascii_lowercase) for _ in range(8)) 

... 。

# DedupChunk class CTOR: 
class DedupChunk: 
    def __init__(self, chunk_size, chunk_pattern, chunk_position=0, state=DedupChunkStates.PENDING): 
     self._chunk_size = chunk_size # chunk size in bytes 
     self._chunk_pattern = chunk_pattern 
     self._chunk_position = chunk_position 
     self._state = state 
     self.mapping = None 

    @property 
    def size(self): 
     return self._chunk_size 

    @property 
    def pattern(self): 
     return self._chunk_pattern 

    @property 
    def position(self): 
     return self._chunk_position 

    @property 
    def state(self): 
     return self._state 

....

# Here Chunk object is being initialized (inside other class's CTOR): 
chunk_size = random.randint(64, 192) * 1024 # in bytes 
     while (position + chunk_size) < self.file_size: # generating random chunks number 
      self.chunks.append(DedupChunk(chunk_size, DedupChunkPattern.get_random_chunk_pattern(), position)) 

....

# Actual writing 
    with open(self.path, 'rb+') as f: 
     for chunk in self.chunks: 
      f.write(chunk.pattern * (chunk.size // 8)) 

PyCharm顯示在寫方法

Expected type 'Union[str, bytearray]' got 'int' instead」 警告,但在 f.write(chunk.pattern * chunk.size)去除除法時,或外面做除法:

chunk.size //= 8 
f.write(chunk.pattern * chunk.size) 

警告消失

這裏實際上發生了什麼?

謝謝

+1

好吧,首先,'chunk.size'和'chunk_size'不是一回事...... –

+0

糟糕,我的錯誤。更新 – Samuel

+0

不知道'chunk.pattern'的內容和類型,很難知道發生了什麼。你可以在沒有乘法的情況下寫入'chunk.pattern'文件嗎? – Evert

回答

12

忽略此警告。 IDE正在從有限的信息中猜測數據類型在運行時會是什麼,但它猜測是錯誤的。也就是說,如果你不知道什麼是實際的東西,那麼期望乘以int將導致int是相當合理的。

如果你真的想解決這個問題,那麼告訴IDE你希望chunk.pattern是通過爲你的類編寫一個文檔字符串(或使用註釋來提供類型提示)。

例如。

class DedupChunk: 
    """ 
    :type _chunk_pattern: str 
    ... other fields 
    """ 
    ... # rest of class 
相關問題