【问题标题】:Python3 exec, why returns None?Python3 exec,为什么返回None?
【发布时间】:2015-06-18 00:16:47
【问题描述】:

当下面这段代码的代码,并返回结果None 为什么?

with open('exx.py', 'rb') as file:
ff = compile(file.read(), 'exx.py', 'exec')
snip_run = exec(ff, locals())
if 'result' in locals():
    print(snip_run, result)
else:
    print(snip_run)

结果:

777777
None

模块代码 exx.py:

print('777777')

【问题讨论】:

  • 尝试打印( print('777777') )
  • None 而不是……什么?你期待什么?就目前而言,这甚至不是有效的语法。
  • 返回相同的东西:print(exec(open ('exx.py').read()))

标签: python python-3.x return exec


【解决方案1】:

当然,问题不仅在于print 返回None,而且始终是exec returns None

>>> exec('42') is None
True

如果您需要返回值,您可以使用eval

>>> eval('42')
42

之后您会注意到 print 仍然返回 None...

【讨论】:

    【解决方案2】:

    谢谢大家决定如下:

    import sys
    from io import StringIO
    from contextlib import contextmanager
    
    
    @contextmanager
    def stdoutIO(stdout=None):
        old = sys.stdout
        if stdout is None:
            stdout = StringIO()
        sys.stdout = stdout
        yield stdout
        sys.stdout = old
    
    
    with stdoutIO() as s:
        with open('exx.py', 'rb') as file:
            ff = compile(file.read(), 'exx.py', 'exec')
            exec(ff, locals())
            if 'result' in locals():
                sys.stdout.write(locals().get('result'))
    
    print(s.getvalue())
    

    【讨论】:

      【解决方案3】:

      打印始终不返回任何内容。

      这也不是你应该从另一个模块执行代码的方式。这就是导入的目的。

      【讨论】:

      • 谢谢你想要的!)而且你可以让 print() 不返回 None?
      猜你喜欢
      • 1970-01-01
      • 2022-09-30
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2016-06-20
      相关资源
      最近更新 更多