我有人告诉我用变量替换代码中常用的常量。例如:
if a > 50:
有类似的东西:
b = 50
if a > b:
考虑到我的代码周围常常使用数字50的事实(例如,对于这些比较)。那怎么更好呢?为此目的的变量是否更符合内存,还是仅仅是为了编码风格?我使用的是Python 3.4
答案 0 :(得分:6)
使用在中心位置设置的变量替换常量的想法不是关于内存管理,而是关于应用程序管理。常量应该是常量,但通常,对应用程序要求的更改需要调整这些常量的值。
因此,如果您有支票a > 50
,可能会在将来某个时候检查a > 60
。在这种情况下,您必须更新代码以反映新要求。
现在,使用常量的想法是,您只需要在中心位置调整这些数字。例如,您可以使用constants.py
模块在中心位置声明所有重要常量,并且只执行检查a > constants.SOME_THRESHOLD
。在这种情况下,当需求发生变化时,您只需要在一个地方更改常量值,而不是搜索所有使用该常量的地方。
这更为重要,如果你有不同的常量具有相同的值但意味着不同的东西。例如,有两个不同的常量用于检查,它们都以值50
开始。现在,对于其中一个常量,值应更改为60
。使用代码中的实际值,您现在需要在每次出现50
时确定它应该是60
还是留在50
。但是使用集中式常量,您只需要更新常量,一切都能正常工作。
拥有常量变量也可以让您获得这些常量获得实际名称的好处。 50
可能意味着什么;但如果有一个变量名,你可以给它一个名称来描述它应该是什么意思。
当然,拥有这样的集中常量对一切都没有意义。您应根据具体情况决定哪些常量值适合作为常量变量提取,哪些不适用。
就内存而言,当然在某个时刻声明变量需要将变量存储在某处。但变量非常便宜,所以它并不重要。并且该值最有可能被回收:对于小整数,Python甚至将实际的常量整数对象保留为缓存。
答案 1 :(得分:1)
通常魔术数字被认为是不好的风格。当我阅读您的代码时,可能不清楚是什么" 50"应该是的意思。分钟?美元吗?这就是你做MAX_MINUTES = 50之类的原因。取决于可能对其他人非常有帮助的代码,以了解其中发生的事情。
答案 2 :(得分:0)
由于您使用的是Python 3.4,我建议您使用IntEnum
替换所有幻数。
这将使您的代码更容易理解,并在必要时更容易修改。
使用枚举的一个好处是你不能像使用变量那样偶然改变它们的值。
考虑这段代码;
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
枚举的具体内容。