print是一个函数吗,print(3)

  print是一个函数吗,print(3)

  

原理阐述

print语句早已被列入不可靠语言特性列表,如Guido的“Python后悔”演讲[1],计划在Python 3000版本中删除。所以这个PEP的目的并不新鲜,虽然可能会在Python开发者中引起很大争议。

  以下关于print()函数的争议,是摘自Guido本人的Python-3000报文[2]:

  Print是唯一有自己语句的应用程序级函数。在Python的世界里,当一些任务在没有编译器的帮助下无法完成时,语法通常会被作为最后的手段。在这种不正常的情况下,打印是不合适的。

  在开发应用程序时,人们经常需要用更复杂的东西来代替打印输出,比如调用日志记录或调用其他I/O库。至于print()函数,这是一个简单的字符替换。现在,它混合了所有这些括号,还可能转换流样式的语法。

  为打印设置特殊的语法只会给进化带来更大的障碍。例如,有一种推测认为新的printf(

  ) 函数不用多久就会出现,跟 print() 函数共存。

  

  • 当需要一个不同的分隔符(不是空格,或者没有分隔符)时,没有简单的方法可以将 print 语句转换成另一个调用。同样地,使用其它一些分隔符而非空格时,根本无法方便地打印对象。

      

  • 如果 print() 是个函数,就可以非常容易地在一个模块内替换它(仅需 def print(*args):…),甚至可以在整个程序内替换(例如放一个不同的方法进 __builtin__.print)。实际上,要做到这点,还可以写一个带 write() 方法的类,然后定向给sys.stdout,这想法不错,但无疑是一个非常巨大的概念飞跃,而且跟 print 相比,它工作在不同的层级。

      

  • 设计规格

    print() 的书写方式取自各种邮件,最近发布在 python-3000 列表里的是【3】:

      

    defprint(*args,sep='',end='n',file=None)

    调用像:

      

    print(a,b,c,file=sys.stderr)

    相当于当前的:

      

    print>>sys.stderr,a,b,c

    可选的 sep 与 end 参数相应地指定了每个打印参数之间及之后的内容。

      

    softspace功能(当前在文件上的半秘密属性,用于告诉 print 是否要在第一个条目前插入空格)会被删除。因此,当前版本的以下写法不能被直接转换:

      

    print"a",print

    它不会在“a”与换行符之间打印一个空格。

      

    (译注:在 3.3 版本,print() 函数又做了改动,增加了默认参数 flush=False)

      

    向后兼容性

    本 PEP 中提出的改动将致使如今的 print 语句失效。只有那些恰好用括号包围了所有参数的写法才能在 Python 3 版本中生效,至于其它,只有加上了括号的值才能保持原样打印。例如,在 2.x 中:

      

    >>>print("Hello")Hello

      >>>print("Hello","world")

      ('Hello','world')

    而在 3.0 中:

      

      

    >>>print("Hello")Hello

      >>>print("Hello","world")

      Helloworld

    幸运的是,因为 print 是 Python 2 中的一个语句,所以它可以被通过自动化工具而检测到,并可靠而精确地替换掉,因此应该没有重大的移植问题(如果有人来写这个工具的话)。

      

    实现

    更改将在 Python 3000 分支中实现(修订版从 53685 到 53704)。大多数在维库代码(legacy code)已经做转换了,但要抓出发行版本中的每个 print 语句,还需要持续不断地努力。

      

    参考资料

    [1]http://legacy.python.org/doc/essays/ppt/regrets/PythonRegrets.pdf

      

    [2]Python 3.0 替换 print(Guido van Rossum)

      

    https://mail.python.org/pipermail/python-dev/2005-September/056154.html

      

    [3] py3k 中 print() 的参数(Guido van Rossum)

      

    https://mail.python.org/pipermail/python-3000/2006-November/004485.html

      


    更多python相关文章请关注python自学网。

    郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

    留言与评论(共有 条评论)
       
    验证码: