назначить вывод print переменной в python - PullRequest
2 голосов
/ 24 февраля 2010

Я хочу знать, как назначить вывод 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) против offX для серии значений.

и моей первой идеей было передать строки в виде ** kwargs в функцию, которая выдаст матрицу соответствующих данных.

Ответы [ 6 ]

6 голосов
/ 24 февраля 2010

Перенаправить 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 и делайте с ним все, что хотите.

Пожалуйста, не обращайте внимания, если я неправильно понял ваше требование.

2 голосов
/ 24 февраля 2010

Вы можете вызывать __str__ и __repr__ для объектов Python, чтобы получить их строковые представления (между ними есть небольшая разница, поэтому обратитесь к документации). Это на самом деле делается внутренним print. 1004 *

0 голосов
/ 24 февраля 2010

Лично я бы так не поступил. Гораздо менее хакерское решение - сначала создать словарь из ваших данных, а затем передать его целиком как **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}]

Что, кажется, именно то, что вы хотите.

0 голосов
/ 24 февраля 2010

Если у вас есть строка «my_string», например:

a=123 b=456 c='hello'

Затем вы можете передать его в функцию 'my_fun' следующим образом:

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

В зависимости от точного форматирования my_string вам, возможно, придется немного изменить это, но это даст вам 90% пути.

0 голосов
/ 24 февраля 2010

для более подробного объяснения: у меня есть список строк, которые я получил из строки комментария файла данных. это выглядит так:

"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) против offX для ряда значений.

0 голосов
/ 24 февраля 2010

Я полагаю, что одна из этих двух вещей выполнит то, что вы ищете:

Оператор Python exec: http://docs.python.org/reference/simple_stmts.html#exec или функция Python eval: http://docs.python.org/library/functions.html#eval

Они оба позволяют динамически оценивать строки как код Python.

UPDATE:

А как же:

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

Я думаю, что это сделает то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...