6

私は次のことをしたいと思います:

print "CC =",CC

しかし、変数CCを一度だけ書き込む必要があるように、関数として。CCは常に浮動小数点数として評価されるため、関数でこれを行う方法がわかりません(これはそうです)...関数への入力を文字列と浮動小数点の両方として受け入れる方法はありますか番号?

私はこれを試しました:

def printme(a): 
    b='%s' % a
    print b
    return b

もちろんa、名前ではなく、の値のみを出力します。

4

7 に答える 7

3

inspectモジュールを使用できます(この SO questionも参照してください):

def printme(x):
    import inspect
    f = inspect.currentframe()
    val = f.f_back.f_locals[x]
    print x, '=', val


CC = 234.234    
printme('CC') # <- write variable name only once
# prints: CC = 234.234
于 2012-07-02T11:41:58.637 に答える
1

おそらく、辞書は問題へのより良いアプローチです。使用したい名前と値のペアがいくつかあると仮定すると、それらをdict:に入れることができます。

params = {"CC": 1.2345, "ID": "Yo!", "foo": "bar"}

次に、たとえば、次のように適切にフォーマットされたすべての名前と値を出力できます。

for key in params:
    print "{0} = {1}".format(key, params[key])

しかし、なぜこれを行おうとしているのかはまだ不明であるため、これが正しい方法であるかどうかを判断するのは困難です。

于 2012-07-02T10:54:53.517 に答える
1

これがあなたの必要な解決策だと思います:

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 マッチングに基づいています。

于 2012-07-02T12:29:56.557 に答える
0

あなたが正しく理解している場合、現在のスコープで変数名とその値を出力するための省略形が必要ですか? これは一般に、インタプリタの trace 関数または sys._getframe を使用しないと不可能です。これは、一般に、自分が何をしているのかを知っている場合にのみ使用する必要があります。これは、print 関数が呼び出しスコープからローカル変数を取得する方法が他にないためです。

def a():
    x = 1
    magic_print("x") #will not work without accessing the current frame

これらなしでできることは、ローカルを次のような関数に明示的に渡すことです。

def printNameAndValue(varname, values):
    print("%s=%s" % (varname, values[varname]))

def a():
    x = 1
    printNameAndValue("x", locals())  #prints 'x=1'

編集:

inspect モジュール (内部的に sys._getframe を使用) を使用したソリューションについては、catchemifyoutry による回答を参照してください。完全を期すために、trace 関数を直接使用したソリューション - Python 2.0 を使用していて、inspect が利用できない場合に役立ちます;)

from sys import settrace

__v = {} #global dictionary that holds the variables

def __trace(frame, event, arg):
    """ a trace function saving the locals on every function call """
    global __v 
    if not event == "call":
        return __trace
    __v.update(frame.f_back.f_locals)

def enableTrace(f):
    """ a wrapper decorator setting and removing the trace """
    def _f(*a, **kwa):
        settrace(__trace)
        try:
            f(*a, **kwa)
        finally:
            settrace(None)
    return _f

def printv(vname):
    """ the function doing the printing """
    global __v 
    print "%s=%s" % (vname, __v[vname])

モジュールに保存して、次のように使用します。

from modulenamehere import enableTrace, printv

@enableTrace
def somefunction():
    x = 1
    [...]
    printv("x")
于 2012-07-02T11:01:15.677 に答える
0

私があなたを正しく理解しているなら、あなたはこのようなものが欲しいですか?

def f(a):
    print('{0}: = {1}'.format(locals().keys()[0], a))

アップデート:

基本的には次と同じであるため、この例はあまり意味がないことを認識しています。

def f(a):
    print('a: {0}'.format(a))

彼が何を達成しようとしているのかよくわからなかったので、OPを locals() に向けたかっただけです。

これは彼が探しているものだと思います:

def f(**kwargs):
    for k in kwargs.keys():
        print('{0}: {1}'.format(k, kwargs[k]))


f(a=1, b=2)
于 2012-07-02T10:45:13.197 に答える
0

まさにあなたが望むものではありませんが、簡単に行うことができます:

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
于 2012-07-02T10:53:56.467 に答える
0

これを達成するためにグローバル変数を使用し、func.__globals__.keys()に渡されたすべての変数が含まれているfuncため、で始まる名前を除外して__リストに保存しました。を呼び出すたびに新しい変数名で更新されるため、追加されたばかりの新しい変数で新しい結果と古い結果を比較func()します。func.__globals__.keys()varnglo

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
于 2012-07-02T11:23:19.493 に答える