Python2.7将函数的输入用作字符串和变量
我想做以下工作:Python2.7将函数的输入用作字符串和变量,python,string,floating-point,Python,String,Floating Point,我想做以下工作: print "CC =",CC 但是作为一个函数,我只需要写一次变量CC。我不知道如何在函数中实现这一点,因为它总是将CC作为一个浮点数进行计算(实际上是这样的)。。。。有没有一种方法可以将函数的输入同时作为字符串和浮点数接受 我试过这个: def printme(a): b='%s' % a print b return b 当然,它只打印a的值,而不是它的名称。如果我没弄错的话,你想要这样的东西吗 def f(a): print('{0
print "CC =",CC
但是作为一个函数,我只需要写一次变量CC。我不知道如何在函数中实现这一点,因为它总是将CC作为一个浮点数进行计算(实际上是这样的)。。。。有没有一种方法可以将函数的输入同时作为字符串和浮点数接受
我试过这个:
def printme(a):
b='%s' % a
print b
return b
当然,它只打印a的值,而不是它的名称。如果我没弄错的话,你想要这样的东西吗
def f(a):
print('{0}: = {1}'.format(locals().keys()[0], a))
更新:
>>> a=10
>>> func(a)
a=10
>>> b=20
>>> func(20)
b=20
>>> foo='cat'
>>> func(foo)
foo=cat
>>> bar=1000
>>> func(bar)
bar=1000
我知道这个例子没有多大意义,因为它基本上与:
def f(a):
print('a: {0}'.format(a))
我只是想把OP指向当地人,因为我不太明白他想要实现什么
我想这更是他想要的:
def f(**kwargs):
for k in kwargs.keys():
print('{0}: {1}'.format(k, kwargs[k]))
f(a=1, b=2)
不完全是您想要的,但很容易做到:
def printme(**kwargs):
for key, value in kwargs.items():
print '%s=%s' % (key, value)
return value
In [13]: printme(CC=1.23, DD=2.22)
CC=1.23
DD=2.22
Out[13]: 1.23
也许字典是解决这个问题的更好办法。假设您有几个要使用的名称-值对,您可以将它们放在
目录中:
params = {"CC": 1.2345, "ID": "Yo!", "foo": "bar"}
然后,例如,您可以打印所有名称和值,格式如下:
for key in params:
print "{0} = {1}".format(key, params[key])
def printNameAndValue(varname, values):
print("%s=%s" % (varname, values[varname]))
def a():
x = 1
printNameAndValue("x", locals()) #prints 'x=1'
from modulenamehere import enableTrace, printv
@enableTrace
def somefunction():
x = 1
[...]
printv("x")
但是,由于还不清楚您为什么要这样做,很难说这是不是正确的方法。如果我理解正确,您想要一个在当前范围内打印变量名及其值的速记?如果不使用解释器跟踪功能或sys.\u getframe,这通常是不可能的,通常只有在您知道自己在做什么时才应该使用。原因是print函数没有其他方法从调用范围获取局部变量:
def a():
x = 1
magic_print("x") #will not work without accessing the current frame
如果没有这些,您可以显式地将局部变量传递给如下函数:
for key in params:
print "{0} = {1}".format(key, params[key])
def printNameAndValue(varname, values):
print("%s=%s" % (varname, values[varname]))
def a():
x = 1
printNameAndValue("x", locals()) #prints 'x=1'
from modulenamehere import enableTrace, printv
@enableTrace
def somefunction():
x = 1
[...]
printv("x")
编辑:
有关使用inspect模块(内部使用sys.\U getframe)的解决方案,请参阅catchemifyoutry的答案。为了完整性,直接使用trace函数的解决方案(如果您使用的是python 2.0,并且inspect不可用,则该解决方案非常有用;)
将其保存在模块中,并按如下方式使用:
for key in params:
print "{0} = {1}".format(key, params[key])
def printNameAndValue(varname, values):
print("%s=%s" % (varname, values[varname]))
def a():
x = 1
printNameAndValue("x", locals()) #prints 'x=1'
from modulenamehere import enableTrace, printv
@enableTrace
def somefunction():
x = 1
[...]
printv("x")
使用了一个全局变量来实现这一点,func.\uuu globals\uuuu.keys()
包含传递给func
的所有变量,因此我用\uuuu
过滤掉了名称startin,并将它们存储在一个列表中。
每次调用func()
都会使用新变量名更新func.\uuuu globals\uuuu.keys()
,因此将新的varn
与旧的glo
结果进行比较,得到刚刚添加的新变量
glo=[]
def func(x):
global glo
varn=[x for x in func.__globals__.keys() if not x.startswith('__') and x!=func.__name__]
new=list(set(varn)^set(glo))
print("{0}={1}".format(new[0],x))
glo=varn[:]
输出:
>>> a=10
>>> func(a)
a=10
>>> b=20
>>> func(20)
b=20
>>> foo='cat'
>>> func(foo)
foo=cat
>>> bar=1000
>>> func(bar)
bar=1000
您可以使用该模块(另请参见):
def printme(x):
进口检验
f=inspect.currentframe()
val=f.f_back.f_locals[x]
打印x,“=”,val
CC=234.234
printme('CC')#我认为这是您需要的解决方案:
def printme(x):
keys_list = [key for key, value in globals().iteritems() if value == x]
print keys_list
for key in keys_list:
if id(globals()[key]) == id(x):
result = "%s = %s" %(key, x)
print result
break
return result
例如,如果您声明一个变量:
>>> c=55.6
然后,printme(c)的结果将是
>>> 'c = 55.6'
注意:此解决方案基于全局唯一id匹配。Python是动态类型的,因此简短的回答是“是的,当然!”。长答案取决于您尝试了什么,您能分享一下您做了什么、出了什么问题以及您期望的结果吗?我尝试了多种方法,这里有一种方法,我尝试打印字符串和浮点数,但结果打印的是浮点数而不是字符串:def printme(a):b='%s',a打印b返回b您为什么需要这个?使用字典不是更有意义吗?继续读下去,看看你做错了什么;缺少一个%
运算符。由于变量不在函数的本地作用域中,这将不起作用。这与写入打印'a=%s'%a
完全相同,因为本地名称将始终为'a'。如果这真的是OP想要的,那么它就无法实现,因为Python的工作方式。是的,这几乎会导致打印以下a:=0.166667,我想做的是打印变量名,所以如果我要输入f(x),我想得到x=0.166667,如果我要输入f(b)我想得到b=0.533或其他任何值。第二个版本要求调用方使用关键字参数。它不能只使用变量名,原因是我只需要写一次CC,而不是两次。我会经常这样做,因此速记很有用,我使用python的应用程序是科学计算,所以在编写数学算法时,你总是这样做来调试,例如在matlab中,这非常简单,因为你只需键入变量名,matlab返回它的值。+1这不是OP想要的,但这是OP应该做的。我见过很多类似的问题,每一个问题最终都决定使用dict是解决这个问题的最方便和最具python风格的方法。@Vader,我不知道这个问题是关于字符串格式的。OP的问题是如何在函数中获取变量名和值,而不显式地提供两者(“有没有一种方法可以将函数的输入同时作为字符串和浮点数”和“…这样我只需要写一次变量CC”)@catchmeifyoutry确定这个问题不是关于格式,而是关于检索变量名。我想说的是,当您试图在Python中获取变量名时,您可能做了一些错误的事情,解决问题的最佳方法是停止使用hacks,开始使用dicts。@Vader啊,好吧,那么,我们同意这个问题,而不是解决方案(对于这个特定的调试用例);)谢谢你澄清你的观点。嗯,谢谢你的努力,我认为你是正确的,因为没有解决方案,在我看来,我原来的解决方案是最好的,困难在于python默认抑制所有输入,实际上是一种禁用方法吗?不知道“抑制所有输入”是什么意思,但是请看@catchmeifyoutry的答案