猿问

定义自己的无类Python常量

我遇到一种情况,要求我从各种来源读取数据库更新指令的集合。所有源都将包含一个主键值,以便将更新应用于数据库的代码可以找到正确的记录。但是,这些文件将在报告的其他列中有所不同。


当我阅读并创建更新说明时,我必须区分提供了列(例如,MiddleName)但为空(意味着没有中间名且该字段应更新为NULL)的更新和其中有MiddleName的更新。字段未包括在内(这意味着更新完全不应该涉及中间名列)。


前一种情况(提供了列,但没有值)似乎由None值适当地表示。但是,对于第二种情况,我想拥有一个NotInFile “值”,可以像使用None一样使用它。


实现此目标的正确方法如下吗?


NotInFile = 1


class PersonUpdate(object):


     def __init__(self):


         self.PersonID = None

         self.FirstName = NotInFile

         self.MiddleName = NotInFile

然后在另一个模块中


import othermod

upd = othermod.PersonUpdate()

if upd.MiddleName is othermod.NotInFile:

    print 'Hey, middle name was not supplied'


交互式爱情
浏览 202回答 3
3回答

哔哔one

不,使用整数1是个坏主意。如果MiddleName始终为字符串或None,则在这种情况下可能会解决,但通常实现可以随意使用整数,字符串,元组和其他不可变值。CPython对上述类型的小整数和常量执行此操作。PyPyis通过值定义整数和一些其他类型。因此,如果MiddleName为1,您肯定会认为您的代码未提供。使用一个object代替,每一个新的对象都有一个独特的身份:NotInFile = object()另外,为了更好地调试输出,请定义您自己的类:class NotInFileType(object):    # __slots__ = () if you want to save a few bytes    def __repr__(self):        return 'NotInFile'NotInFile = NotInFileType()del NotInFileType # look ma, no singleton如果您偏执狂,可以将其设为适当的单身(丑陋)。如果需要几个这样的实例,则可以将类重命名为Sentiel或类似的东西,将表示形式设置为实例变量并使用多个实例。
随时随地看视频慕课网APP

相关分类

Python
我要回答