模拟Lisp:Python中的关键字

时间:2013-02-06 22:42:22

标签: python

我想做那样的事情:

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 个答案:

答案 0 :(得分: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必须做出区分,因为它是homoiconic,但由于Python 不是 homoiconic,因此区别是不必要的。

替代

如果您使用数字,那么您将失去REPL能力。例如,

default = 1
do_something = 2
do_other_thing = 3

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

有更复杂的方法可以做到这一点,比如创建特殊的类,但是小的好处不值得增加复杂性。

答案 1 :(得分:3)

以下类的实例将返回您从中调用的任何属性的名称。创建变量k或其他东西会使访问变得简单。

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

>>> k = LispKeyword()
>>> k.blarg
'blarg'
>>> k.what
'what'

答案 2 :(得分:0)

对于您提供的代码,您可以将变量设置为需要调用的函数。对于更通用的解决方案,您可以使用字符串或枚举。另请参阅https://stackoverflow.com/a/3743555/113586

答案 3 :(得分:0)

现在正在python-ideas列表"constant/enum type in stdlib"上讨论为语言添加类似内容的想法,多个设计和纯Python实现被抛弃并被挑选。在上一轮讨论中,Guido和几乎所有人都同意某些值得添加,但没有人决定添加什么。

所以,我认为你可以说实际上已经发明了实现枚举常数的惯用方法。

值得浏览一下该线程,以了解被认为是惯用的内容,以及明显的方法是,如果你是荷兰人,等等。如果你想要使用枚举,那么在选择实现之前更值得浏览。

与此同时,如果你想知道2013年2月遥远过去的惯用语,我同意Dietrich Epp的观点,认为弦乐几乎总是这类问题的正确选择。

他解释了为什么性能问题在Python中不是问题,但是人们总是提出一件我想要解雇的事情:

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

如果您使用了某种严格的枚举,则不会发生这种情况 - 或者至少可以通过在assert isinstance(thingy, Primate) / if链前加elif来防范它

这一切听起来都不错,直到你看到这一行:

thigny == 'monkey'
相关问题