为什么print语句不是pythonic?

时间:2009-06-27 23:27:51

标签: python python-3.x

这个问题困扰了我很长一段时间(正如my previous question所证明的那样):为什么print(x)print x更好(定义为更加pythonic)?

对于那些不知道的人,print语句已在Python 3.0中更改为函数。正式文档位于PEP 3105,动机位于Guido van Rossum's email

对于那些我想提出反对意见的观点:

  1. 还有其他运算符,例如我们作为语句编写的import,尽管它们的功能实际上与函数__import__重复
    • 对于初学者,运算符print不属于通用应用程序逻辑。对他们来说,这是一个神秘的运营商,这是他们的计划的高潮。他们希望它看起来不同。
    • 所有描述基本Python 2.x的初学者书籍现在保证会从第一个示例中删除。当然,语言有时会发生变化,但这些变化通常对初学者来说不太明显。
    • 我不能立即明白print的功能可以在应用程序级别上重复。例如,有时我想从控制台重定向打印作为模态操作系统对话框。
    • 虽然人们说很难将所有print语句重写为函数,但是他们强迫每个Python 2.x开发人员完成所有项目的操作。好,自动转换器并不难。
    • 如果print是一个包含函数print的语句,那么每个喜欢有能力操作函数__print__的人都会得到很好的服务。
  2. 那么,我们能不能在Stack Overflow页面上对这个问题做出规范的回答?

5 个答案:

答案 0 :(得分:56)

答案 1 :(得分:11)

这就是我讨厌2.x中的print语句的原因。

>>> something()
<something instance at 0xdeadbeef>
>>> print something()
<something instance at 0xdeadbeef>

毫无价值的对象没有用__str__,好的,我可以处理,再看看它。

>>> dir(something())
['foo', 'bar', 'baz', 'wonderful']
>>> help(something().foo)
"foo(self, callable)"

嗯..那个可调用的参数是什么?

>>> something().foo(print)
    something().foo(print)
                        ^
SyntaxError: invalid syntax
>>> something().foo(lambda *args: print(*args))
    something().foo(lambda *args: print(*args))
                                      ^
SyntaxError: invalid syntax

所以......我必须定义一个使用

的函数
>>> def myPrint(*args): print *args
    def myPrint(*args): print *args
                              ^
SyntaxError: invalid syntax
>>> def myPrint(*args): print args
...
>>> myPrint(1)
(1,)

Shudder,或者使用sys.stdout.write,这几乎就像cludgy一样,因为它与print的行为截然不同。它也看起来不同,这意味着我几乎永远不会记得它存在。

在一个简短的一次性类型设施中使用print语句然后改进它以使用日志记录或更好的东西只是不优雅。如果print就像那些东西一样工作,特别是可以用于高阶函数,那么当你不使用真正的日志或真实时,它会比你使用的东西更好调试器。

答案 2 :(得分:8)

print语句还带有用于打印到特定文件的异常>>语法。在Python中没有其他语句具有这种语法,所以这种方式很不寻常。

我相信你是对的,print语句的大多数问题都可以通过引入__print__函数来解决。

答案 3 :(得分:6)

我发现GvR的“打印是唯一具有专用于它的声明的应用程序级功能”令人信服。 Python是一种通用语言,不应该有作为运算符或关键字输出到流的语句。

答案 4 :(得分:3)

它不是pythonic,因为语法应该是:

stdout.append("Hello World")

stdout += "hello world"

免责声明:我真的非常喜欢Python。

严肃地说......

我认为Python的对象模型和“自己实现”方法对属性可见性这样的方法很有用。我认为这是OOP的“一切都是对象”的方法,甚至定义为对象结构集合的对象都非常清晰。

我担心Python会做的是成为一种语言,并没有以明确的方式呈现它的意图......而且我不愿意看到这些原则之美陷入过度思考已经非常规语法表达的过程中。有点像 Lisp ,在它的结构中很漂亮,在它的语法中非常粗糙。