Defining my own None-like Python constant

前端 未结 3 927
独厮守ぢ
独厮守ぢ 2020-12-04 02:42

I have a situation in which I\'m asked to read collections of database update instructions from a variety of sources. All sources will contain a primary key value so that t

相关标签:
3条回答
  • 2020-12-04 02:43

    If you want type-checking, this idiom is now blessed by PEP 484 and supported by mypy:

    from enum import Enum
    
    class NotInFileType(Enum):
        _token = 0
    
    NotInFile = NotInFileType._token
    

    If you are using mypy 0.740 or earlier, you need to workaround this bug in mypy by using typing.Final:

    from typing import Final
    
    NotInFile: Final = NotInFileType._token
    

    If you are using Python 3.7 or earlier, you can use typing_extensions.Final from pip package typing_extensions instead of typing.Final

    0 讨论(0)
  • 2020-12-04 02:58

    No, using the integer one is a bad idea. It might work out in this case if MiddleName is always a string or None, but in general the implementation is free to intern integers, strings, tuples and other immutable values as it pleases. CPython does it for small integers and constants of the aforementioned types. PyPy defines is by value for integers and a few other types. So if MiddleName is 1, you're bound to see your code consider it not supplied.

    Use an object instead, each new object has a distinct identity:

    NotInFile = object()
    

    Alternatively, for better debugging output, define your own class:

    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
    

    If you're paranoid, you could make it a proper singleton (ugly). If you need several such instances, you could rename the class into Sentiel or something, make the representation an instance variable and use multiple instances.

    0 讨论(0)
  • 2020-12-04 03:06

    I don't see anything particularly wrong with your implementation. however, 1 isn't necessarily the best sentinel value as it is a cached constant in Cpython. (e.g. -1+2 is 1 will return True). In these cases, I might consider using a sentinel object instance:

    NotInFile = object()
    

    python also provides a few other named constants which you could use if it seems appropriate: NotImplemented and Ellipsis come to mind immediately. (Note that I'm not recommending you use these constants ... I'm just providing more options).

    0 讨论(0)
提交回复
热议问题