【问题标题】:Python 3 print without parenthesisPython 3 打印不带括号
【发布时间】:2015-11-14 08:50:35
【问题描述】:

print 曾经是 Python 2 中的语句,但现在它变成了 Python 3 中需要括号的函数。

在 Python 3 中是否有抑制这些括号的方法?也许通过重新定义打印功能?

所以,而不是

print ("Hello stack over flowers")

我可以打字:

print "Hello stack over flowers"

【问题讨论】:

  • 您是否有特殊原因要这样做?或者你只是好奇?即使可能,重新定义关键字通常也不是一个好习惯。
  • 出于好奇,为什么人们不赞成这个?我不明白它是如何超出 SO 准则的。
  • 我使用的是 Python 3。但是,一直输入 () 会非常耗时。
  • 迈克尔,你看起来不太友善。我做错什么了吗?我问的是一个诚实的问题,即使听起来像你的解决方法编码标准。如果它是如此“标准”,他们不会在 Python 3 中更改它,不是吗?
  • 我想我应该说“语言规范”:) 如果我所说的任何内容令人反感,我深表歉意。我只是想帮助您充分利用 SO。

标签: python printing


【解决方案1】:

没有。这将始终是 Python 3 中的语法错误。考虑使用 2to3 将您的代码转换为 Python 3

【讨论】:

  • 我正在使用 Python 3。我只是想避免一直输入括号。 shift + 9 ..... 然后shift + 0 是详尽无遗的。
  • 抱歉,函数调用使您输入困难。我自己是一个非常糟糕的打字员,所以即使我没有任何身体残疾,我也会尽我所能尽量减少使用移位键。
  • 显然,没有人欣赏使用 bash '历史回忆' 时向上箭头的简单性。这很简单。与print 一样,它应该不受诸如一对括号之类的无用调试技术的阻碍。
  • 对此有一些争论,在引入 Python 3 之前已经进行了广泛的排练。虽然额外的括号可能对我们这些可怜的打字员来说不方便,但重新定义 print 的能力提供了灵活性。值得,我相信。
【解决方案2】:

你不能,因为没有括号的唯一方法就是让它成为一个关键字,就像在 Python 2 中一样。你不能手动定义一个关键字,所以不行。

【讨论】:

    【解决方案3】:

    在 Python 3 中,print 是一个函数,而在以前的版本中它曾经是一个语句。正如@holdenweb 建议的那样,使用2to3 翻译您的代码。

    【讨论】:

      【解决方案4】:

      虽然在 Python 3 中打印需要一对括号,但 print 之后不再需要空格,因为它是一个函数。所以这只是一个额外的字符。

      如果您仍然发现键入一对括号“不必要地耗时”,您可以使用p = print 并以这种方式节省一些字符。因为您可以将新引用绑定到函数但不能绑定到关键字,所以您只能在 Python 3 中使用 print 快捷方式。

      Python 2:

      >>> p = print
        File "<stdin>", line 1
          p = print
                  ^
      SyntaxError: invalid syntax
      

      Python 3:

      >>> p = print
      >>> p('hello')
      hello
      

      这会降低您的代码的可读性,但每次打印时都会保存这几个字符。

      【讨论】:

      • 谢谢 TigerhawkT3。是的,这会节省时间,但就像你说的那样,它会降低代码的可读性。
      • @Tigerhawk 此解决方法与 IDE 不兼容
      • @ChandraShekhar - 什么 IDE?你在说什么?这没有理由受到 IDE 选择的影响。
      • @TigerhawkT3 我在 Eclipse 中尝试了同样的方法,但没有成功
      • @ChandraShekhar - 它以何种方式“不兼容”?尝试后会发生什么?
      【解决方案5】:

      使用 Autohotkey 制作宏。 AHK 是免费的,而且安装非常简单。 www.autohotkey.com

      您可以将宏分配给 alt-p:

      !p::send print(){Left}
      

      这将使 alt-p 输出 print() 并将光标移动到括号内。

      或者,更好的是,直接解决您的问题,您定义一个自动替换并将其范围限制为打开的文件具有 .py 扩展名时:

      #IfWinActive .py            ;;; scope limiter
      :b*:print ::print(){Left}   ;;; I forget what b* does. The rest should be clear 
      #IfWinActive                ;;; remove the scope limitation
      

      这是一个有保证的、无痛的、透明的解决方案。

      【讨论】:

        【解决方案6】:

        AHK 脚本是个好主意。只是对于那些感兴趣的人,我需要对其进行一些更改以适合我:

        SetTitleMatchMode,2         ;;; allows for a partial search 
        #IfWinActive, .py           ;;; scope limiter to only python files
        :b*:print ::print(){Left}   ;;; I forget what b* does
        #IfWinActive                ;;; remove the scope limitation
        

        【讨论】:

          【解决方案7】:

          我终于找到了在旧的 Python2 示例脚本中更改这些的正则表达式。否则使用 2to3.py。

          在 Regexr.com 上试试,在 NP++ 中不起作用(?):

          find:     (?<=print)( ')(.*)(')
          replace: ('$2')
          

          对于变量:

          (?<=print)( )(.*)(\n)
          ('$2')\n
          

          对于标签和变量:

          (?<=print)( ')(.*)(',)(.*)(\n)
          ('$2',$4)\n
          

          【讨论】:

          • 这是一个适用于 NP++ 的正则表达式 (?&lt;=print)( ')(.*)(') \('$2'\)
          • 谢谢@Jack,需要转义括号(只是替换?)..很高兴知道。另外,我发现了一个半相关的技巧,Py3 可以识别在print ('string') 之间有一个空格,以便可以更轻松地突出显示可打印内容,然后使用许多编辑器的自动关闭来添加括号和引号。
          【解决方案8】:

          在 Python 3 代码中使用不带括号的print 不是一个好主意。也不是创建别名等。如果这是一个交易破坏者,请使用 Python 2。

          不过,不带括号的print 在交互式shell 中可能很有用。这实际上并不是减少字符数的问题,而是避免在调试时每次想要打印某些内容时都按两次 Shift 键。 IPython 允许您在以斜线开头的行不使用括号来调用函数:

          Python 3.6.6 (default, Jun 28 2018, 05:43:53)
          Type 'copyright', 'credits' or 'license' for more information
          IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.
          
          In [1]: var = 'Hello world'
          
          In [2]: /print var
          Hello world
          

          如果你打开autocall,你甚至不需要输入斜线:

          In [3]: %autocall
          Automatic calling is: Smart
          
          In [4]: print var
          ------> print(var)
          Hello world
          

          【讨论】:

          • 使用 python 2 作为替代品,正如帖子所建议的那样,很快就不可能了。
          【解决方案9】:

          您可以使用运算符重载:

          class Print:
              def __lt__(self, thing):
              print(thing)
          
          p = Print()
          
          p < 'hello'   #  ->  hello 
          

          或者,如果您喜欢在 c++ iostreams 中使用 &lt;&lt;

          【讨论】:

            猜你喜欢
            • 2018-06-19
            • 2017-02-25
            • 2021-11-16
            • 1970-01-01
            • 2012-01-12
            • 2011-10-12
            • 2019-02-23
            • 1970-01-01
            • 2022-01-10
            相关资源
            最近更新 更多