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的答案