2

私はそのようなことをしたい:

action = :default

if some_condition1:
    action = :do_something

if some_condition2:
    action = :do_other_thing

...

if action == :default:
   one_reaction()
elif action == :do_something:
   other_reaction()
...

アクションの選択を表すために何を使用する必要がありますか?

頭に浮かぶバリアント:

  • 列挙型を作成する

    class MyActions:
        DEFAULT=1
        SO_SOMETHING=2
        SO_OTHER_THING=3
    

    不便です。前後にスクロールして、新しいアクションの選択肢を「登録」する必要があります。

  • マジックナンバーを使用します。良くない。

  • 文字列を使用します。
4

4 に答える 4

4

Lispの「記号」は、概念的には、インターンされた文字列と考えることができます。

action = 'default'

if some_condition1:
    action = 'do_something'

if some_condition2:
    action = 'do_other_thing'

...

if action == 'default':
   one_reaction()
elif action == 'do_something':
   other_reaction()
...

Lispでシンボルを使用するときはいつでも、Pythonは文字列を使用します。Lispは同像性であるため区別する必要がありますが、Pythonは同像性ではないため、区別は不要です。

代替案

代わりに数字を使用すると、REPL機能が失われます。例えば、

default = 1
do_something = 2
do_other_thing = 3

>>> x = default
>>> x
1 # is 1 default? I can't remember...

特別なクラスを作成するなど、これを行うためのより洗練された方法がありますが、小さな利点は追加の複雑さの価値がありません。

于 2013-02-06T22:45:03.647 に答える
3

次のクラスのインスタンスは、そこから呼び出す属性の名前を返します。変数kなどを作成すると、アクセスが簡単になります。

class LispKeyword(object):
    def __getattribute__(self, name):
        return name

>>> k = LispKeyword()
>>> k.blarg
'blarg'
>>> k.what
'what'
于 2013-02-06T22:48:59.130 に答える
0

提供したコードでは、呼び出す必要のある関数に変数を設定できます。より一般的な解決策として、文字列または列挙型を使用できます。https://stackoverflow.com/a/3743555/113586も参照してください

于 2013-02-06T22:46:14.333 に答える
0

言語に何かのような列挙型を追加するというアイデアは、現在python-ideasリスト「stdlibの定数/列挙型」で議論されており、複数の設計と純粋なPython実装が投げかけられて選択されています。前回のディスカッションでは、Guidoと他のほとんどの人が、何かを追加する価値があることに同意しましたが、誰も何を追加するかを決定しませんでした。

したがって、列挙型定数を実行する慣用的な方法は、実際にはまだ発明されていないと言えます。

そのスレッドをざっと読んで、慣用句と見なされるものや、オランダ人の場合など、それを行うための明白な方法を理解することは価値があります。また、列挙型を使用したい場合は、実装を選択する前にざっと目を通す価値があります。

一方、たとえば2013年2月の遠い過去の慣用句を知りたい場合は、このタイプの問題に対して文字列がほとんどの場合正しい選択であるというディートリッヒ・エップに同意します。

彼は、パフォーマンスの問題がPythonの問題ではない理由を説明していますが、私が却下したいことが常に人々に提起されていることがもう1つあります。

thingy = 'mokney'
# ...
if thingy == 'gorilla': do_gorilla()
elif thingy == 'monkey': do_monkey()
else: do_default()

ある種の厳密な列挙型を使用した場合、これは発生しません。または、少なくとも、/チェーンのassert isinstance(thingy, Primate)前に置くことで保護できます。ifelif

この行を見るまでは、どれも素晴らしいと思います。

thigny == 'monkey'
于 2013-02-06T23:09:37.123 に答える