是否有与 Ruby 符号等效的 Python?

Posted

技术标签:

【中文标题】是否有与 Ruby 符号等效的 Python?【英文标题】:Is there a Python equivalent to Ruby symbols? 【发布时间】:2011-04-14 04:47:01 【问题描述】:

是否有 Python 等价于 Ruby 符号?

如果是,那是什么?

如果不是,那么我们是否只能在字典中使用 strings 作为我们的 keys

【问题讨论】:

跟进您对this answer below 的评论:如果您想要一些可以输入d.b 而不是d['b'] 的内容,您可以只使用一个空的class D(object): pass 来创建一个实例@987654325 @ 然后你可以将你的值分配给你组成的属性,比如d.a=1d.b=2,当然也可以像print(d.a + d.b)一样获取它们的值。不确定这是否会比答案中的d['b'] 之类的普通字典查找要慢。 另外,如果你想要一个数据类型不是字符串的唯一常量,你也可以为此使用自定义类 【参考方案1】:

不,python 没有符号类型。

但是,默认情况下,字符串字面量是实习的,其他字符串可以使用 intern 函数进行实习。所以在字典中使用字符串字面量作为键的性能并不比在 ruby​​ 中使用符号低。

【讨论】:

+1。幸运的是,对于我们 Ruby 开发人员来说,高性能不是一个词。 (对不起,我们太语义化了!):D 这样做的主要好处是该语言少了一种核心语法和内置类型。当可以透明地完成时,语言中不必要的复杂性。 @Glenn 起初我很不高兴听到 Python 没有符号并且字符串文字可以用作键。问题是我对必须在所有键周围加上引号这一事实不满意。有没有办法解决这个问题? @J3M 7OR3:不,当然没有办法解决这个问题。但请考虑一下:它只是一个额外的字符,在实际代码中,无论如何您经常使用变量而不是文字键。 @delnan,当然有办法解决这个问题:dict(a=1,b=2,c=3)。【参考方案2】:

正如其他人所说,Python 中没有符号,但字符串很好用。

为避免引用字符串作为键,请使用 dict() 构造函数语法:

d = dict(
    a = 1,
    b = 2,
    c = "Hello there",
    )

【讨论】:

具有讽刺意味的是,这个解决方案确实,至少在最初,限制您使用字符串作为键。 是的,这是一种解决方法,但仅限于分配步骤。我仍然必须在 d['b'] 中的 b 周围添加引号以获得它的值。我想我只记得红宝石符号更容易输入。我希望有一个模块可以解决这个问题。我想知道它是否会使程序运行得更慢。【参考方案3】:

对于那些感兴趣的人来说:当在哈希中使用时,Ruby 中的符号与 python 中的空对象非常相似。例如你可以这样做:

some_var = object()

然后将字典键设置为 some_var:

some_dict =  some_var : 'some value' 

然后进行标准检索:

some_dict[some_var]

但是,正如 sepp2k 指出的那样,这样做并没有性能优势。事实上,我做了一个快速测试,发现几乎没有性能提升:

a, b, c, d, e = [object() for _ in range(5)]
dict_symbols = a : 'a', b : 'b', c : 'c', d : 'd', e : 'e'
dict_strings = 'a' : 'a', 'b' : 'b', 'c' : 'c', 'd' : 'd', 'e' : 'e'

def run_symbols():
    for key in dict_symbols.keys():
        dict_symbols[key]

def run_strings():
    for key in dict_strings.keys():
        dict_strings[key]

在 ipython 中测试的速度:

In [3]: %timeit run_symbols
10000000 loops, best of 3: 33.2 ns per loop

In [4]: %timeit run_strings
10000000 loops, best of 3: 28.3 ns per loop

所以在我的情况下,“符号”运行速度较慢! (对于有趣的数字,不准确)。但是需要注意的是,这样做可能有内存优势。如果您不关心键类型对象的占用空间比字符串小。

import sys
sys.getsizeof('some_var') # 45
some_var = object() 
sys.getsizeof(some_var) # 0

虽然这引发了python如何处理变量名some_var的内存的问题。

【讨论】:

很好的答案!感谢您对此进行调查。【参考方案4】:
    不,没有等价物。 不,您可以将每个可散列对象用作字典键。

【讨论】:

可以将字符串文字分配给变量,然后将该变量用作键。例如橙色 = '橙色' food_type = 橙色:'水果',香蕉:'水果' @J3M 7OR3:字符串是可散列的!和所有不可变类型一样。关于第二个问题...... Python 不是 javascript - dict 文字中的键并不特殊。它们可以是任何表达式(变量、文字,...),被评估并将结果用作键。所以是的,这行得通。 @delnan 好的。但是使用变量而不是字符串文字作为关键的最佳实践吗?人们通常会这样做吗?或者他们是否可以只使用字符串文字(带引号)作为键? @J3M 7OR3:什么?大多数情况下,您在编写程序时不可能知道密钥。当然k = "key"; d[k] = "value" 是愚蠢的(但不是for k in keys: d[k] = "default",虽然有更好的方法),但正如已经说过的,大多数时候你使用运行时值作为键。【参考方案5】:

不是一流的类型,但确实存在https://pypi.python.org/pypi/SymbolType。

【讨论】:

以上是关于是否有与 Ruby 符号等效的 Python?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript/Coffeescript/jQuery 中是不是有与 Ruby 的发送等效的内容?

是否有与 Haskell 'let' 等效的 Python

非 GNU 链接器是不是有与 GNU 链接器“--just-symbols”选项等效的选项?

是否有与“which”命令等效的 Python [重复]

是否有与 Python 的 @property 装饰器等效的 C++11?

是否有与 Python 的 cProfile 等效的 Julia 分析器?