2017-07-07 6 views
9

site定数を除く)built-in constantsのマニュアルでは、それは述べていますその:6つの組み込み定数のうち2つが割り当て可能なのはなぜですか?

Note: The names None , False , True and __debug__ cannot be reassigned (assignments to them, even as an attribute name, raise SyntaxError), so they can be considered “true” constants.

私は間違っていない場合も重複して説明したように、TrueFalseは(Pythonの3の「真」あらわす定数になりました。 )

質問:なぜ、他の2つ(Ellipsis,NotImplemented)が「真」であるのはなぜですか?この制限を免除したこれらを再割り当てするためのユースケースはありますか(numpyEllipsisでしょうか?)

standard library typesのドキュメントでは、EllipsisNotImplementedの両方のタイプは、動作上、Noneタイプと同じです。すなわち:

  • は、彼らが特別な操作をサポートしていないシングルトン
  • です。

この質問は、提案された重複とは関係ありません:Why were True and False changed to keywords in Python 3。それは完全に異なる何か、すなわち、EllipsisNotImplementedではない理由を「真」の定数を尋ねない理由Trueとのものに変更False

+1

ここに私の意見があります。**任意の**組み込みオブジェクトを上書きするためのユースケースはありません。そのようなコードは危険なものとして扱うべきです。一方、すべてのキーワードを作成すると、維持するのが難しくなります(C側)。だから私はPythonの進化の問題だと思う。 'None'''、' False''、 'True''は常に使われているので、特に注目しています。 – freakish

+4

面白いことに、 'Ellipsis = 2'は問題ありませんが、' ... = 2'は 'SyntaxError:Ellipsisに代入できません。 ' –

+0

@freakishそれは一つの意見です。 Pythonは単純に好きです(特にPython 3への移行では単純化した後で)、他の2つの名前を維持する余分な複雑さが同じ振る舞いをするcontantの一貫性よりもどれほど優れているのか分かりません。だからこそ、ユースケースがあるはずだと思ったのです。 –

答えて

3

キーワードではない有効な識別子に割り当てることができます。 TrueFalseNoneの特別なものは、となります。キーワードと識別子です。あなたはこの質問ではそのための推論について読むことができますようにNotImplementedEllipsisなど

Why were True and False changed to keywords in Python 3

組み込み関数は特殊なケースではない、というようにintlisttypeされず、どちらも。 NotImplementedに代入しても、組み込み定数は変更されません。代わりに、Ellipsisという名前を現在のスコープ内の別の値にバインドします。元のEllipsisは変更されていません。

キーワードに割り当てるのはSyntaxErrorです。

keywordsモジュールをインポートすると、キーワードのリストが表示されます。

>>> import keyword 
>>> keyword.kwlist 

['False', 
'None', 
'True', 
'and', 
'as', 
'assert', 
'break', 
'class', 
'continue', 
'def', 
'del', 
'elif', 
'else', 
'except', 
'finally', 
'for', 
'from', 
'global', 
'if', 
'import', 
'in', 
'is', 
'lambda', 
'nonlocal', 
'not', 
'or', 
'pass', 
'raise', 
'return', 
'try', 
'while', 
'with', 
'yield'] 

などがあり、このリストに含まれていない組み込み識別子の多くがあり、そしてあなたがintに新しい値を割り当てることができ、Ellipsisそれは、有効な識別子名ではありませんので、

...は、特殊なケースです最初の場所に割り当てられることは不可能です。

多くの他の言語に比べて、Pythonは予約されたキーワードのリストをかなり短く保ちます。1つの理由はおそらく、何らかの理由でEllipsisのような識別子を使用して言語の一部となったコードと下位互換性を保つためです。

+2

私はキーワードへの割り当てが許可されていないことを理解しています。問題はなぜTrueに代入するのがエラーなのかではなく、代入可能なときに 'Ellipsis'と' NotImplemented'が「定数」として指定されている理由です。下位互換性はもちろん問題ですが、2から3への移行は、TrueとFalseで行われたように、このような変更を可能にします。 –

+0

元の組み込み定数は、現在の有効範囲内の他の値に名前を割り当てた場合でも変更されません。 –

+1

はい、バインディングの仕組みもわかります。これはまだ*なぜ*あなたが上記の名前に再バインド(割り当て)することはできません。 –

関連する問題