あなたは、Python 3.4を使用しているので、私はIntEnum
で、すべてのマジックナンバーを交換することをお勧め。
これにより、コードをわかりやすくし、必要に応じて変更しやすくなります。
enumを使用する利点は、変数の場合と同じように、値を誤って変更できないことです。
このコードを検討してください。
import os
from hashlib import sha256
def compare(src, dest):
"""
Compare two files.
Arguments
src: Path of the source file.
dest: Path of the destination file.
Returns:
0 if source and destination are different
1 source and destination are identical
2 destination doesn't exist
3 source doesn't exist
"""
xsrc, xdest = os.path.exists(src), os.path.exists(dest)
if not xsrc:
return 3
if not xdest:
return 2
with open(src, 'rb') as s:
csrc = sha256(s.read()).digest()
if xdest:
with open(dest, 'rb') as d:
cdest = sha256(d.read()).digest()
else:
cdest = b''
if csrc == cdest:
return 1
return 2
このコード自体は不明ではありません。それはすべて文書化されています。 しかし、一度を試して返信値をにすると、常にドキュメントを参照する必要があります。
以下のコードは、その動作をなぜ説明しますか? compare
のドキュメントを参照しているわけではありません。
res = compare(file_a, file_b)
if res == 1 or res == 3:
pass
elif res == 0:
# copy file_a to file_b
これを見てください。
import os
from hashlib import sha256
from enum import IntEnum
class Cmp(IntEnum):
differ = 0 # source and destination are different
same = 1 # source and destination are identical
nodest = 2 # destination doesn't exist
nosrc = 3 # source doesn't exist
def compare(src, dest):
"""
Compare two files.
Arguments
src: Path of the source file.
dest: Path of the destination file.
Returns:
Cmp enum
"""
xsrc, xdest = os.path.exists(src), os.path.exists(dest)
if not xsrc:
return Cmp.nosrc
if not xdest:
return Cmp.nodest
with open(src, 'rb') as s:
csrc = sha256(s.read()).digest()
if xdest:
with open(dest, 'rb') as d:
cdest = sha256(d.read()).digest()
else:
cdest = b''
if csrc == cdest:
return Cmp.same
return Cmp.differ
これを使用すると、次のようになります。
res = compare(file_a, file_b)
if res == Cmp.same or res == Cmp.nosrc:
pass
elif res == Cmp.differ:
# copy file_a to file_b
これは、compare
のドキュメントを参照しなくてもわかります。おそらく、Cmp
列挙型の詳細を確認する必要はありません。
小さなintはcpythonにキャッシュされますので、あまりにも多くの時間を費やすことなく、同じものを使用してください。 –
読みやすいものを使用してください。メモリはここでは問題ではありません。 –
あなたのコードでは50が "よく使われる定数"であると言われています。その場合は、50を変数として格納し、おそらくは「b」よりも読みやすい名前で格納する方が優れたコーディングスタイルであり、変数を使用します。 – Hun