

Ask HN: Why do I have to type print "x: "+str(x) in Python? - noaharc

Why can't Python just be smart enough to cast x automatically (like every other language I work with)?<p>I imagine there is a not-bad reason, as Guido is pretty damn smart, but it's beyond me.
======
aristus

        >>> x = 1234
        >>> print "x:", x
        x: 1234

~~~
jibiki

      >>> print "x: "+x
      Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      TypeError: cannot concatenate 'str' and 'int' objects
    

To my mind, "x: "+x is ugly. Perl style "x: $x" makes more sense. But I don't
speak python, so my opinion is meaningless.

~~~
mbrubeck
It works if you use a comma, like the comment you replied to.

Python 2.6 introduces string interpolation like Ruby/Perl. (Older versions
used printf-style format strings.)

    
    
      print "x: {x}".format(x=1234)  # New in 2.6
    
      print "x: %d" % x              # Old
    

[http://docs.python.org/tutorial/inputoutput.html#fancier-
out...](http://docs.python.org/tutorial/inputoutput.html#fancier-output-
formatting)

~~~
iclelland
To be fair, that's not quite the same as perl/shell-style interpolation.

In perl, "$x" pulls the value of $x from the variable namespace. In your Py2.6
example, the "{x}" format in the string has nothing to do with a variable
named x; rather it references the keyword args supplied to format.

To simulate perl's

    
    
      print "x: $x";
    

you would

    
    
      print "x: {x}".format(x=x)

------
ajuc
You haven't work with that many languages, have you :)

>>> x = 3 + "7"

What type should be x now: int or str ?

Also: "10" is lesser than "2" but 10 is greater 2.

Should (3 + "7") > 2 return true ?

Such automatic conversions forces you to remember many arbitrary rules, and
when you forget it, you have bug that shows later.

It's easier to just write that str() (or use operator %).

~~~
stonemetal
He converted to string before he attempted the add so it isn't a strong type
vs weak type issue. It is a they haven't overloaded the + operator to perform
string append. Which may or may not be logical.

~~~
ajuc
Poster asked why he has to type print "x="+str(x). I assumed he would like to
just type print "x="+x.

For that code to work str.__add__(self,x) should accept int as parameter x.

If that was the case, then "3" + 7 would return "37" (ok, I've thought it will
be "10", my bad :)), but 7 + "3" would still cast exception. So + would be not
symmetric.

~~~
mbrubeck
Of course, str.__add__ is already asymmetric, since "3"+"7" != "7"+"3"

------
vomjom
If you want Python to "be smart enough to cast x automatically", then you want
a weakly typed language. Weakly typed languages are difficult to reason about.

For example, should "3" == 3? Should 3 automatically be converted to "3" in
that instance, or vice-versa?

Anyway, a better solution is: print "x: %s" % x

------
eru
See <http://www.python.org/dev/peps/pep-0020/>:

    
    
      Explicit is better than implicit.

------
vorador
<http://news.ycombinator.com/item?id=568033>

