2010-02-23 5 views
2

Je veux savoir comment affecter la sortie de l'impression à une variable.affecter la sortie de l'impression à une variable en python

si

mystring = "a=\'12\'" 

puis

print mystring 
a=12 

et je veux passer cela comme kwargs **,

test(mystring) 

comment puis-je faire cela?

pour plus d'une explication: j'ai une liste de chaînes que j'ai obtenu à partir d'une ligne de commentaire d'un fichier de données. il ressemble à ceci:

"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'", 
''] 

je veux mettre les valeurs dans une structure afin que je puisse tracer les choses différentes par rapport à tout variabls si la liste est une légende au fond, et je veux tracer des fonctions des traces par rapport à des variables donné dans la légende. Donc, si pour chaque entrée j'ai une trace, alors je peux tracer max (trace) vs offX pour une série de valeurs. Et ma première idée était de passer les chaînes comme ** kwargs à une fonction qui produirait une matrice de données correspondantes.

+3

Qu'essayez-vous d'accomplir? Ce que vous essayez réellement de faire n'est pas clair, mais si c'est une fonctionnalité semblable à eval(), ce n'est probablement pas une bonne idée. – sth

Répondre

0

Je ne le ferais pas de cette façon, personnellement. Une solution beaucoup moins hackish est de construire d'abord un dictionnaire à partir de vos données, puis de le passer entièrement à une fonction comme **kwargs. Par exemple (ce n'est pas la façon la plus élégante de le faire, mais il est à titre indicatif):

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 

Cette impression:

[{'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}] 

qui semble être exactement ce que vous voulez.

+0

c'est très bien. un peu impliqué, mais je pense que la meilleure solution. ce problème est survenu parce que le fichier texte en clair que je regarde est vraiment une série de traces pour de nombreuses variations de conception. J'ai juste besoin d'un moyen de consolider les données et de regarder quelque chose de compréhensible, comme Max (trace) vs parameterX, et tous les paramètres sont donnés dans la première ligne comme un commentaire, mais l'ordre de ceux-ci correspond à l'ordre des colonnes données dans la partie de données. J'espère que c'est clair et pas très décousu. de toute façon, merci beaucoup. alex – alex

+0

Cela peut certainement être fait beaucoup plus élégamment et en moins de lignes de code. De plus, si vous pensez que c'est la meilleure réponse, veuillez l'accepter. –

6

Redirige stdout et capture sa sortie dans un objet?

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 

Et puis juste prendre la « sortie » de foo.content et faire ce que vous voulez.

Veuillez ne pas tenir compte si j'ai mal compris votre exigence.

+1

+ 1 d'accord pour la plupart ... peut-être que vous voudrez peut-être ré-accéder à l'original sys.stdout pour imprimer quelque chose. donc faites ceci 'sys_stdout_save = sys.stdout' avant de ré-affecter sys.stdout –

+0

@AJ: bien sûr, on préfèrerait' rewire' stdout à un moment approprié. Il n'est pas vraiment clair ce que l'affiche veut réaliser de toute façon OMI. – jldupont

+0

+1 indépendamment de l'intention réelle de l'OP, il est utile de savoir comment "hi-jack" sys.stdout. Et oui, on voudra peut-être le conserver pour rétablir la sortie normale à un moment ultérieur, mais c'est trivial. – mjv

0

Je crois que l'une de ces deux choses vont accomplir ce que vous cherchez:

L'instruction exec Python: http://docs.python.org/reference/simple_stmts.html#exec ou la fonction eval Python: http://docs.python.org/library/functions.html#eval

Tous deux vous permettent d'évaluer dynamiquement des chaînes comme code Python.

MISE À JOUR:

Qu'en est-:

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

Je pense que cela va faire ce que vous cherchez.

+0

c'est proche mais je ne peux pas le faire fonctionner. Je veux évaluer une chaîne et la passer à une fonction comme kwargs – alex

+0

Pourriez-vous ne pas faire quelque chose comme 'eval (" test ("+ mystring +") ")'? –

2

Vous pouvez appeler __str__ et __repr__ sur des objets python pour obtenir leur représentation sous forme de chaîne (il y a une petite différence entre eux, donc consultez les docs). C'est effectivement fait par print en interne.

0

pour plus d'une explication: J'ai une liste de chaînes que j'ai obtenu à partir d'une ligne de commentaire d'un fichier de données. il ressemble à ceci:

"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'", 
''] 

Je veux mettre les valeurs dans une structure afin que je puisse tracer les choses différentes par rapport à toute variabls si la liste est une légende au fond, et je veux tracer des fonctions des traces par rapport aux variables données dans la légende. Donc, si pour chaque entrée j'ai une trace, alors je peux tracer max (trace) vs offX pour une série de valeurs.

0

Si vous avez une chaîne « my_string » comme ceci:

a=123 b=456 c='hello' 

Ensuite, vous pouvez passer à une fonction « my_fun » comme ceci:

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

En fonction de la mise en forme précise de my_string , vous devrez peut-être varier un peu, mais cela devrait vous atteindre 90% du chemin.

+0

J'ai essayé ceci et j'ai eu une erreur de syntaxe, je ne suis pas sûr de la théorie derrière cela. – alex

Questions connexes