2

プログラムが一意のファイルシステム パスを生成し、ファイル システム エントリを作成しないようにするにはどうすればよいですか?

このtempfile.mktemp関数は強く非推奨です。これは、プログラムが安全でないファイル作成に対して脆弱になるためです。

一部のコード (ユニット テストなど) では、実際のファイル システムに存在させたくないtempfile.mktempファイル システム エントリの一意のパスを生成するために呼び出しています。この場合、ファイルがないため、ファイルシステムのセキュリティの問題は関係ありません。

その関数の非推奨は依然として懸念事項です。コードが問題であるかどうかを良心的なすべての読者が判断する必要があるようなコードは望んでいないからです。代わりに、コードは正当に非推奨の API を避ける必要があります。

また、明示的かつ強力に廃止されているため、将来のある時点でその API 関数が消える傾向があります。

が提供するその他の機能は、ファイルシステムに触れないようにする必要性をまったく提供せず、一意のパスを取得するだけですtempfile

したがって、一般的に の非推奨には同意しtempfile.mktempますが、ライブラリはこの目的に代わるものを提供していないようです。

tempfile.mktempのような一意のパスを生成し、そのパスで実際のファイルを作成しないために、どの標準ライブラリ関数を使用する必要があり ますか?

4

3 に答える 3

2

私の知る限り、一意の名前を生成するがファイルを作成しない標準関数はありません。「mktemp」関数の内部実装を見て、独自のものを作成してください...

あなたにとって興味深いかもしれないコードは次のとおりです。

class _RandomNameSequence:
    """An instance of _RandomNameSequence generates an endless
    sequence of unpredictable strings which can safely be incorporated
    into file names.  Each string is six characters long.  Multiple
    threads can safely use the same instance at the same time.

    _RandomNameSequence is an iterator."""

    characters = "abcdefghijklmnopqrstuvwxyz0123456789_"

    @property
    def rng(self):
        cur_pid = _os.getpid()
        if cur_pid != getattr(self, '_rng_pid', None):
            self._rng = _Random()
            self._rng_pid = cur_pid
        return self._rng

    def __iter__(self):
        return self

    def __next__(self):
        c = self.characters
        choose = self.rng.choice
        letters = [choose(c) for dummy in range(8)]
        return ''.join(letters)
于 2016-02-14T22:16:46.597 に答える
1

これは、プログラミングの質問と同じくらいコードの保守に関する質問です。これを解決するための 1 つのオプションを次に示します。

  • の周りにラッパー関数を作成し、tempfile.mktempドメインに一致するわかりやすい名前を付けます (たとえば、 のようなものcreate_database_path_name)
  • 実装では、tempfile.mktemp呼び出しの上にコメントを書いて、慎重に検討され、この使用法に対して安全であると見なされた理由を説明します。

最初のステップでは、推奨されない関数の呼び出しが 1 か所だけに含まれるようにします。2 番目のステップでは、将来のコード レビューのために 1 つの場所が十分に文書化されていることを確認します。

非推奨の関数がモジュールから消えた場合、元の実装をコピーするなどして、修正する場所は 1 か所だけです。

于 2016-02-14T22:22:10.837 に答える
0

ファイルを作成する予定がないため、非推奨の理由mktempは関係ありません。ランダムなファイル名を生成し、それがあなたが望むものです。それを理解していないレビュアーが心配なら、簡単なコメントで十分です。または、次のような独自のファイル名を作成して、base64.b64encode(os.urandom(20)).decode('ascii')彼らの繊細な感性を傷つけないようにすることもできます。

于 2016-02-14T22:32:42.343 に答える