将print的输出分配给python中的变量

时间:2010-02-23 21:39:19

标签: python

我想知道如何将print的输出分配给变量。

所以,如果

mystring = "a=\'12\'"

然后

print mystring 
a=12

我希望像** kwargs一样传递这个,

test(mystring)

我该怎么做?

更多解释:我有一个从数据文件的注释行获得的字符串列表。它看起来像这样:

"a='0.015in' lPrime='0.292' offX='45um' offY='75um' sPrime='0.393' twistLength='0'",
 "a='0.015in' lPrime='0.292' offX='60um' offY='75um' sPrime='0.393' twistLength='0'",
 "a='0.015in' lPrime='0.292' offX='75um' offY='75um' sPrime='0.393' twistLength='0'",
 '']

我想把这些值放到某个结构中,这样我可以绘制各种不同的变量,所以列表基本上是一个图例,我想绘制迹线的函数与传奇中给出的变量。

所以如果对于每个条目我有一个跟踪,那么我可能想要为一系列值绘制max(trace)vs offX。

我的第一个想法是将字符串作为** kwargs传递给一个能产生相应数据矩阵的函数。

6 个答案:

答案 0 :(得分:6)

重定向stdout并将其输出捕获到对象中?

import sys

# a simple class with a write method
class WritableObject:
    def __init__(self):
        self.content = []
    def write(self, string):
        self.content.append(string)

# example with redirection of sys.stdout
foo = WritableObject()                   # a writable object
sys.stdout = foo                         # redirection

print "one, two, three, four"            # some writing

然后从foo.content获取“输出”并用它做你想做的事。

如果我误解了你的要求,请不要理会。

答案 1 :(得分:2)

您可以在python对象上调用__str____repr__来获取它们的字符串表示形式(它们之间存在细微差别,因此请参阅文档)。这实际上是由print内部完成的。

答案 2 :(得分:0)

我相信这两件事中的一件可以完成你想要的东西:

Python exec语句:http://docs.python.org/reference/simple_stmts.html#exec 或Python eval函数:http://docs.python.org/library/functions.html#eval

它们都允许您将字符串动态评估为Python代码。

<强>更新

怎么样:

def calltest(keywordstr):
    return eval("test(" + keywordstr + ")")

我认为这会做你想要的。

答案 3 :(得分:0)

更多解释: 我有一个从数据文件的注释行获得的字符串列表。    它看起来像这样:

"a='0.015in' lPrime='0.292' offX='45um' offY='75um' sPrime='0.393' twistLength='0'",
 "a='0.015in' lPrime='0.292' offX='60um' offY='75um' sPrime='0.393' twistLength='0'",
 "a='0.015in' lPrime='0.292' offX='75um' offY='75um' sPrime='0.393' twistLength='0'",
 '']

我想将这些值放入某种结构中,这样我就可以绘制各种不同的变量 因此列表基本上是一个图例,我想绘制迹线的函数与传奇中给出的变量。

所以如果对于每个条目我有一个跟踪,那么我可能想要为一系列值绘制max(trace)vs offX。

答案 4 :(得分:0)

如果你有一个字符串'my_string',就像这样:

a=123 b=456 c='hello'

然后你可以将它传递给函数'my_fun',如下所示:

my_fun(**eval('{' + my_string.replace(' ', ',') + '}'))

根据my_string的精确格式,您可能需要稍微改变一下,但这应该可以让你获得90%的目标。

答案 5 :(得分:0)

我个人不这样做。一个远不那么强硬的解决方案是首先从您的数据构建字典,然后将其整体传递给**kwargs函数。例如(这不是最优雅的方式,但它是说明性的):

import re

remove_non_digits = re.compile(r'[^\d.]+')

inputList = ["a='0.015in' lPrime='0.292' offX='45um' offY='75um' sPrime='0.393' twistLength='0'",
 "a='0.015in' lPrime='0.292' offX='60um' offY='75um' sPrime='0.393' twistLength='0'",
 "a='0.015in' lPrime='0.292' offX='75um' offY='75um' sPrime='0.393' twistLength='0'", '']

#remove empty strings
flag = True
while flag:
    try:
        inputList.remove('')
    except ValueError:
        flag=False

outputList = []

for varString in inputList:
    varStringList = varString.split()
    varDict = {}
    for aVar in varStringList:
        varList = aVar.split('=')
        varDict[varList[0]] = varList[1]
    outputList.append(varDict)

for aDict in outputList:
    for aKey in aDict:
        aDict[aKey] = float(remove_non_digits.sub('', aDict[aKey]))

print outputList

打印:

[{'a': 0.014999999999999999, 'offY': 75.0, 'offX': 45.0, 'twistLength': 0.0, 'lPrime': 0.29199999999999998, 'sPrime': 0.39300000000000002}, {'a': 0.014999999999999999, 'offY': 75.0, 'offX': 60.0, 'twistLength': 0.0, 'lPrime': 0.29199999999999998, 'sPrime': 0.39300000000000002}, {'a': 0.014999999999999999, 'offY': 75.0, 'offX': 75.0, 'twistLength': 0.0, 'lPrime': 0.29199999999999998, 'sPrime': 0.39300000000000002}]

这似乎正是你想要的。