Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以将python配置为类似matlab的打印吗?_Python_Matlab - Fatal编程技术网

我可以将python配置为类似matlab的打印吗?

我可以将python配置为类似matlab的打印吗?,python,matlab,Python,Matlab,我可以将python配置为类似于matlab的打印,以便在我只有一个函数时 returnObject() 它只是打印那个对象而不需要我在它周围键入print?我假设这并不容易,但是如果一个对象没有被其他变量绑定,它应该被打印出来,这样就可以工作了 a = 5 #prints nothing b = getObject() #prints nothing a #prints 5 b #prints getObject() getObject() #prints the object 如果你使用

我可以将python配置为类似于matlab的打印,以便在我只有一个函数时

returnObject()
它只是打印那个对象而不需要我在它周围键入print?我假设这并不容易,但是如果一个对象没有被其他变量绑定,它应该被打印出来,这样就可以工作了

a = 5 #prints nothing
b = getObject() #prints nothing
a #prints 5
b #prints getObject()
getObject() #prints the object

如果你使用ipython笔记本电脑,每个电池都是这样工作的。但通过键入对象名称,每个单元格只能查看一个对象。要查看多个对象,您需要调用print,或使用大量单元格。

您可以编写一个脚本,根据一组定义打印内容的规则修改原始脚本,然后运行修改后的脚本

执行此操作的基本脚本是:

f = open('main.py', 'r')
p = open('modified.py', 'w')

p.write('def main(): \n')

for line in f:
    temp = line
    if len(temp) == 1:
        temp = 'print(' + line + ')'

    p.write('\t' + temp)

p.close()

from modified import main

main()
脚本main.py将如下所示:

x = 236
x
输出:

236

其思想如下:解析Python代码的AST,将每个表达式替换为调用
print
,并将表达式的内容作为参数,然后运行修改后的版本。我不确定它是否适用于所有代码,但您可以尝试一下。将其另存为
matlab.py
,并将代码作为
python3-m matlab file.py
运行

#!/usr/bin/env python3
import ast
import os
import sys

class PrintAdder(ast.NodeTransformer):
    def add_print(self, node):
        print_func = ast.Name("print", ast.Load())
        print_call = ast.Call(print_func, [node.value], [])
        print_statement = ast.Expr(print_call)
        return print_statement

    def visit_Expr(self, node):
        if isinstance(node.value, ast.Call) and node.value.func.id == 'print':
             return node
        return self.add_print(node)

def main():
    import argparse

    parser = argparse.ArgumentParser()
    parser.add_argument('infile', type=argparse.FileType(), nargs='?', default='-')
    args = parser.parse_args()

    with args.infile as infile:
        code = infile.read()

    file_name = args.infile.name

    tree = ast.parse(code, file_name, 'exec')
    tree = PrintAdder().visit(tree)
    tree = ast.fix_missing_locations(tree)

    bytecode = compile(tree, file_name, 'exec')
    exec(bytecode)

if __name__ == '__main__':
    main()

我认为这不可能在代码级别实现,因为该语言是专门为识别特定类型的语句而构建的。您是否尝试过IPython Terminal(而不是notebook)?我认为Python调试器可能会执行类似的操作。这不是你想要的答案,但可能不会太远。正如下面提到的,我发现ipython笔记本非常笨重。它又慢又慢。我不知道这是pycharms的错还是ipythons的错,但我还没有找到解决这些问题的好办法。所以我在寻找更好的。嗯,很接近,但不是我想要的。我发现笔记本电脑有点笨重,需要所有的设置。至少pycharmAnd的速度有点慢,那么包含一个无意义字符的多行docstring呢?它们肯定也会在matlab中打印出来吗?你只需要适当地设置规则。e、 g.如果您愿意,也可以让行以分号结束以抑制输出。看起来与我的想法完全一样,明天将尝试。@Hakaishin同样,如果您使用Python 2,这可能需要修改一点。