我遇到一种情况,要求我从各种来源读取数据库更新指令的集合。所有源都将包含一个主键值,以便将更新应用于数据库的代码可以找到正确的记录。但是,这些文件将在报告的其他列中有所不同。当我阅读并创建更新说明时,我必须区分提供了列(例如,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或类似的东西,将表示形式设置为实例变量并使用多个实例。
添加回答
举报
0/150
提交
取消