web-dev-qa-db-ja.com

書き込みメソッドで「予期されたタイプ 'Union [str、bytearray]'は代わりに 'int'を取得しました」警告

私のスクリプトは、事前に生成されたデータパターンを使用して、チャンクごとにファイルに書き込みます。

_#  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)
_

警告が消えた

ここで実際に何が起こったのですか?

ありがとう

11
Samuel

この警告は無視してください。 IDEは、実行時のデータ型について(限られた情報から)最良の推測を行っていますが、間違った推測をしています。 intを使用すると、実際に何かがわからない場合はintになります。

本当にこれを解決したい場合は、IDE期待することを伝えてくださいchunk.patternは、クラスのドキュメント文字列を記述する(または注釈を使用して型のヒントを提供する)ことによって作成します。

例えば。

class DedupChunk:
    """
    :type _chunk_pattern: str
    ... other fields
    """
    ... # rest of class
28
Dunes