是否有与 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=1
和d.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 的发送等效的内容?
非 GNU 链接器是不是有与 GNU 链接器“--just-symbols”选项等效的选项?