为了账号安全,请及时绑定邮箱和手机立即绑定

定义自己的无类Python常量

定义自己的无类Python常量

交互式爱情 2021-04-01 14:38:07
我遇到一种情况,要求我从各种来源读取数据库更新指令的集合。所有源都将包含一个主键值,以便将更新应用于数据库的代码可以找到正确的记录。但是,这些文件将在报告的其他列中有所不同。当我阅读并创建更新说明时,我必须区分提供了列(例如,MiddleName)但为空(意味着没有中间名且该字段应更新为NULL)的更新和其中有MiddleName的更新。字段未包括在内(这意味着更新完全不应该涉及中间名列)。前一种情况(提供了列,但没有值)似乎由None值适当地表示。但是,对于第二种情况,我想拥有一个NotInFile “值”,可以像使用None一样使用它。实现此目标的正确方法如下吗?NotInFile = 1class PersonUpdate(object):     def __init__(self):         self.PersonID = None         self.FirstName = NotInFile         self.MiddleName = NotInFile然后在另一个模块中import othermodupd = othermod.PersonUpdate()if upd.MiddleName is othermod.NotInFile:    print 'Hey, middle name was not supplied'
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

不,使用整数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或类似的东西,将表示形式设置为实例变量并使用多个实例。


查看完整回答
反对 回复 2021-04-05
  • 3 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信