什么时候变量在PEP8命名样式方面被认为是常数?

时间:2017-06-19 17:46:54

标签: python pep8

为了与PEP8约定保持一致,在.py中我可以将常量定义为:

NAME = "Me"
AGE = "Old"
GENER = "Male"

如果.txt在一行中包含Me Old Male,而在另一个.py中执行了FILE = "C:/path/to/file.txt" # a declared constant, easy with open(FILE, 'r') as f: content = f.read().rstrip('\n').split() data = ','.join(content) # returns Me,Old,Male

content

问题(S):

可以将datacontent视为常量吗?

要保持常量,必须在构建时将变量声明为常量吗?

或者,常数副变量是在运行时由用户输入改变的能力的函数吗?

支持信息:

.rstrip()是文件中的内容,但它受.split()data约束,但它以后永远不会更改。 content.join()制作,但未经更改且不受>>> A = 2 # a declared constant >>> B = 2 # another declared constant >>> TOTAL = A + B # 'caps' per PEP8 for constant naming 4 的约束。这两个值在初始化后都没有变化。

我认为这类似于:

TOTAL

假设程序已经终止并且 def writeToCassandra(df: DataFrame, tableName: String) { if (df.take(1).length>0){ println("Number of rows in DF are: "+ df.count); df.write .format("org.apache.spark.sql.cassandra") .mode("overwrite") .options(Map( "header" -> "true", "output.batch.grouping.key" -> "none", "cassandra.output.throughput_mb_per_sec" -> "1MB", "table" -> tableName, "keyspace" -> "vardb_irc", "cluster" -> "CassandraPOCluster") ) .save() } else{ println("Dataframe is empty"); } } 永远不会改变,我会认为这个值是常数。再次假定在运行期间任何不可更改的变量都被视为常量。

随意改变我的观念,以符合标准!

2 个答案:

答案 0 :(得分:7)

如果要将值作为常量处理其余代码,请务必使用CONSTANT_CASE表示这些全局变量。这取决于你,它只是一个文档约定。

换句话说,这是一个惯例,旨在让未来的代码读者更容易理解这样一个全局的价值只设置一次并且预计不会改变该计划的有效期。

请注意,我通常会尝试避免在模块导入时加载文件数据;它使测试和影响性能变得更加困难。首次使用时加载该数据(使用函数)。

答案 1 :(得分:0)

我认为你将常量变量的概念与文件中保存的实际数据混淆起来。 Python实际上没有像C或Java那样的常量概念。因此,用大写的变量名声明常量变量的符号只是告诉程序员(你)的一个约定,你正在处理一个不应该改变的变量,但是python不会限制你做如此。

我能想到的唯一方法是将“真正的”常量设为一个属性,并限制__setattr__

class Constant:
    def __init__(self, name, age, gender):
        self.__dict__["NAME"] = name
        self.__dict__["AGE"] = age
        self.__dict__["Gender"] = gender

    def __setattr__(self, a, v):
        raise TypeError("Cannot set attributes of '{}' class".format(str(self.__class__).rsplit('.',1)[1]))

因此,您可以阅读属性,但无法设置它们:

In [131]: c = Constant("Me", "Old", "Male")

In [132]: c.NAME
Out[132]: 'Me'

In [133]: c.NAME = 'd'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-133-d979661dfd1d> in <module>()
----> 1 c.NAME = 'd'

<ipython-input-130-9a8604514ac4> in __setattr__(self, a, v)
      6 
      7     def __setattr__(self, a, v):
----> 8         raise TypeError("Cannot set attributes of '{}' class".format(str(self.__class__).rsplit('.',1)[1]))

TypeError: Cannot set attributes of 'Constant'>' class