1

この質問の範囲外の理由で、私はシリアル化メカニズムを構築しています。None特別な場合に必要だと思うオブジェクトで問題が発生しました。NoneType他の組み込みタイプとは異なる扱いを受ける理由を誰かが説明できますか?それとも私は何かが足りないのですか?

>>> import sys
>>> builtin = sys.modules['__builtin__']
>>> getattr(builtin,'int')
<type 'int'>
>>> getattr(builtin,'list')
<type 'list'>
>>> getattr(builtin,'NoneType')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'NoneType'

Ubuntuのpython2.6.5

明確化

もちろん

getattr(builtin,'None')

None動作し、のインスタンスであるオブジェクトを返しますNoneType。ただし、クラスオブジェクトは、__builtin__他のすべてのモジュールに存在します。したがって、このコードは、以下を除くすべての組み込み型で機能しますNone

klass = getattr(builtin, obj.__class__.__name__)

それを考えると理にかなっています

>>> type(0).__module__
'__builtin__'
>>> type("foo").__module__
'__builtin__'
>>> type(None).__module__
'__builtin__'

これが失敗するという事実はNone、私が何かを見逃していない限り、Pythonでは見落としのようです。

4

5 に答える 5

2

NoneTypeあなたがそれにアクセスする必要がほとんどないので、あなたが呼ぶものは特別に扱われると思います。あなたは言えた

>>> NoneType = type(None)

isinstance(x, NoneType)このタイプを名前にバインドしますが、それは一般的な目的には役立ちませんx is None。コンストラクターは、TypeErrorインスタンスを構築することになっていないことを示します。そしてそれから派生することも禁じられています。

ただし、高度な目的で必要な場合は、、、またはのtype(None)いずれNone.__class__かを使用してタイプにアクセスできます。types.NoneType

于 2012-10-30T17:03:57.473 に答える
1

奇妙です。しかし、Python 2のクラスとオブジェクトについては、多くの奇妙なことがあります。これは、単純なスクリプトから本格的なOOに進化した多くの言語に当てはまります。Python3はこれを解決することを目的としています。

NoneTypeは、シングルトンのクラスオブジェクトであるため、すでに特殊なケースであり、コンストラクターとして呼び出すことはできません。

TypeError: cannot create 'NoneType' instances

したがって、一般的なシリアライザーを作成している場合は、クラスオブジェクトを検索できないかどうかに関係なく、とにかく特殊なケースなしを指定する必要があります。

于 2012-10-30T18:38:11.373 に答える
0

あなたは見てみましたか:

>>> dir(builtin)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']

NoneType組み込みタイプとしてリストされていません(ただしNone

于 2012-10-30T16:56:20.733 に答える
0

を試してみてください。 の値と同様に、ではないgetattr(builtin,"None")ので、の属性ではありません。getattr(builtin,"NoneType")NoneTypetype(None)builtin

In [49]: type(None)

Out[49]: <type 'NoneType'>

Pythonはどこにも見つからないため、これは機能しませんNoneType

In [50]: type(NoneType)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)

/home/monty/<ipython console> in <module>()
NameError: name 'NoneType' is not defined
于 2012-10-30T16:57:01.657 に答える
0

NoneTypeは、typesモジュールで使用できます。

>>> import types
>>> types.NoneType
<type 'NoneType'>

事実タイプモジュールは、タイプで何かをしている場合に使用するのに適した場所です。ビルトインに存在するタイプに依存しないでください。

Noneは実際には型ではなく、組み込み定数であるという事実を使って何かをすることになるでしょう。ドキュメントでさえ、Noneのタイプはtypes.NoneTypeであると述べていますが、あなたは正しいです。それは特別な方法で実装されており、他のすべてのタイプと矛盾しています。

于 2012-10-30T17:14:00.550 に答える