[Python-3000] symbols?

Kendall Clark kendall at monkeyfist.com
Tue Apr 11 22:37:10 CEST 2006


On Apr 11, 2006, at 4:09 PM, Ian Bicking wrote:
> Martin v. Löwis wrote:
>> Kendall Clark wrote:
>>> Thanks, Martin. That is, in fact, pretty much what I'd like to 
>>> see in
>>> Py3K, modulo the issue about getattr.
>> the shift key either way (: is shift-.; " is shift-2).
>> Symbols make it clear you are talking about some more-constrained 
> value (like an enumeration), or an in-process name (like a method 
> name). Strings can just be data, which is generally used very 
> differently. In addition to immutability, I think this is an 
> important part of how symbols are used in Lisp and Ruby (they don't 
> seem to actually be used as much in Smalltalk, more of an 
> implementation detail). Also, when passed a string or symbol, you 
> can get a better idea of what it was intended for.

Yeah, my primary motivation is summed up nicely here; in some cases a 
symbol expresses intent better (IMO) than a string.
> And, for example, having to cast the string to a symbol before 
> using it with getattr() will make the security implications a 
> little clearer.

Yep.
> At the same time, I think it is more in line with Python's design 
> to avoid talking about the names of things, and instead talk about 
> the things themselves. After all, you don't do:
>> make(:var, 10)
>> You do:
>> var = 10
>> In most cases this is how Python works now. Literal strings show 
> up sometimes.

They get used as terms in Domain Specific Languages in Python. Or, 
more commonly, one writes some king of generic symbol-like class that 
just wraps the string. But then everyone has to repeatedly reinvent 
that wheel. I guess it depends on how often Python is used as a host 
language for DSLs. But I tend to do a lot of that kind of programming 
(or, rather, a high percentage of the programming I do is of that 
type). So embedding a rule engine (with syntax for rules & facts) in 
Python is harder w/out symbols than it would be with them.
> I see them in descriptors (or complex tricks to avoid them).

Yeah, Pylons just got this syntax for web-dispatching:
 @pylons.rest.restrict("GET", "HEAD")
 def get_instance(self, id): pass
Okay, so HTTP methods are so well know that the intent there is very 
clear. But it's less so when yr talking about some less known DSL, 
perhaps one written for a specific application.
The other choice, of course, is for the library or API to define some 
variables bound to strings and then use them like constants, except 
that they can get redefined:
 @pylons.rest.restrict(GET, HEAD)
 ...
A symbol has the advantage that it can't be assigned to, so can't 
change like a variable, but expresses more clearly than a string the 
intent to refer to a name or term, not string data:
 @pylon.rest.restrct(:GET, :HEAD)
> In hasattr() they are common, in getattr() occasionally to make 
> use of the third getattr() argument -- either can be avoided with 
> try:except AttributeError: if you choose. That's most of what I 
> can think of now.

I think Ian put his finger on a good point, as usual: in Python we 
refer to things, not to their names, more often. But if you want to 
embed little languages in Python, you refer to the names of things 
from some other domain pretty often. Yeah, this is more of a Lisp or 
Ruby or Haskell application, but I prefer Python for lots of reason 
and want to use it for writing DSLs.
In that kind of app, strings get used to represent terms and names 
pretty often, and it just doesn't *feel* right. :>
Cheers,
Kendall


More information about the Python-3000 mailing list

AltStyle によって変換されたページ (->オリジナル) /