2012-07-02 39 views
6

Tôi muốn làm như sau:Python 2.7 bằng cách sử dụng đầu vào cho một chức năng như là một chuỗi và biến

print "CC =",CC 

nhưng như một chức năng để tôi chỉ phải viết CC biến một lần. Tôi không thể làm việc ra làm thế nào để làm điều này trong một chức năng như nó luôn luôn đánh giá CC như một số điểm nổi (mà nó là) .... Có cách nào để chấp nhận đầu vào cho một chức năng như cả một chuỗi và điểm nổi con số?

Tôi cố gắng này:

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

nhưng tất nhiên nó chỉ in ra giá trị của a, không tên của nó.

+2

Python được nhập động, vì vậy câu trả lời ngắn gọn là "Có, tất nhiên!". Câu trả lời dài phụ thuộc vào những gì bạn đã thử, bạn có thể chia sẻ những gì bạn đã làm và những gì đã đi sai và những gì bạn mong đợi thay thế? –

+0

Tôi đã thử nhiều thứ, đây là nơi tôi đang cố gắng in chuỗi và số dấu chấm động nhưng kết quả là in điểm nổi và không có chuỗi: – malby

+0

def printme (a): b = '% s', a in b trả lại b – malby

Trả lời

0

Nếu tôi hiểu chính xác bạn muốn một cái gì đó như thế này?

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

Cập nhật:

Tôi biết rằng ví dụ không làm cho rất nhiều ý nghĩa, vì nó là cơ bản giống như:

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

Tôi chỉ muốn chỉ các OP cho người dân địa phương() vì tôi không hoàn toàn hiểu những gì anh ấy đang cố gắng hoàn thành.

Tôi đoán đây là nhiều hơn những gì anh đang tìm kiếm:

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


f(a=1, b=2) 
+1

điều này sẽ không hoạt động vì biến không nằm trong phạm vi địa phương của hàm – l4mpi

+0

Điều này hoàn toàn giống với việc viết 'in' a =% s '% a' làm tên địa phương sẽ luôn là' a '. Nếu điều này thực sự là những gì OP muốn, thì nó không thể được thực hiện vì cách Python hoạt động. –

+0

tính năng này sẽ không hoạt động, tên cục bộ sẽ luôn là 'a'. –

0

Không chính xác những gì bạn muốn, nhưng dễ dàng để làm:

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 
1

Có lẽ một cuốn từ điển là một phương pháp tốt hơn cho vấn đề. Giả sử bạn có một vài cặp tên-giá trị mà bạn muốn sử dụng, bạn có thể đặt chúng trong một dict:

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

Sau đó, ví dụ, bạn có thể in tất cả các tên và các giá trị độc đáo được định dạng như thế này:

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

Nhưng vì vẫn chưa rõ ràng lý do tại sao bạn đang cố thực hiện việc này, thật khó để biết đây có phải là cách phù hợp hay không.

+1

Lý do tại sao tôi chỉ phải viết CC một lần chứ không phải hai lần. Tôi sẽ thực hiện điều này rất hữu ích, ứng dụng tôi sử dụng python là máy tính khoa học vì vậy khi viết các thuật toán toán học bạn làm điều này tất cả thời gian để gỡ lỗi, trong MATLAB ví dụ điều này rất đơn giản vì bạn chỉ cần gõ tên biến và MATLAB trả về giá trị của nó. – malby

+2

+1 Đây không phải là những gì OP muốn, nhưng đây là những gì OP nên làm. Tôi đã nhìn thấy rất nhiều câu hỏi tương tự như trên SO và mỗi người trong số họ kết thúc với quyết định rằng việc sử dụng một dict là cách thuận tiện nhất và nhiều nhất để giải quyết vấn đề. – Vader

+0

@Vader, tôi không thấy làm thế nào một câu hỏi này là về định dạng chuỗi. Vấn đề của OP là làm thế nào để * lấy * tên biến và giá trị bên trong một hàm mà không cung cấp * cả hai * một cách rõ ràng ("Có cách nào chấp nhận đầu vào cho hàm như cả chuỗi và số dấu phẩy động" và ".. để tôi chỉ phải viết biến CC một lần "). – catchmeifyoutry

0

Nếu tôi hiểu chính xác bạn muốn viết tắt để in tên biến và giá trị của nó trong phạm vi hiện tại? Điều này nói chung là không thể mà không sử dụng chức năng theo dõi phiên dịch hoặc sys._getframe, mà nói chung chỉ nên được sử dụng nếu bạn biết những gì bạn đang làm. Lý do cho điều này là các chức năng in không có cách nào khác nhận được người dân địa phương từ phạm vi gọi:

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

gì bạn có thể làm mà không có những được vượt qua một cách rõ ràng người dân địa phương đến một chức năng như thế này:

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

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

EDIT:

Xem câu trả lời bằng cách xác định mô-đun kiểm tra (sử dụng nội bộ sys._getframe).Cho đầy đủ một giải pháp sử dụng chức năng theo dõi trực tiếp - hữu ích nếu bạn đang sử dụng python 2.0 và kiểm tra không có sẵn;)

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]) 

Save nó trong một mô-đun và sử dụng như thế này:

from modulenamehere import enableTrace, printv 

@enableTrace 
def somefunction(): 
    x = 1 
    [...] 
    printv("x") 
+0

mmm, cảm ơn vì những nỗ lực, tôi nghĩ rằng bạn là chính xác trong đó không có giải pháp, Có vẻ như tôi bây giờ là giải pháp ban đầu của tôi là tốt nhất, khó khăn phát sinh do python đàn áp tất cả các đầu vào như mặc định, thực sự là một cách vô hiệu hóa điều này? – malby

+0

Không biết ý bạn là gì khi 'triệt tiêu tất cả các yếu tố đầu vào', nhưng hãy xem câu trả lời bằng cách @catchmeifyoutry cho một giải pháp sử dụng kiểm tra (sử dụng nội bộ hàm theo dõi). – l4mpi

0

đã sử dụng biến toàn cầu để đạt được điều này, func.__globals__.keys() chứa tất cả các biến được chuyển đến func, vì vậy tôi đã lọc tên bắt đầu bằng __ và lưu chúng trong danh sách. với mọi cuộc gọi đến func() số func.__globals__.keys() được cập nhật với tên biến mới, vì vậy hãy so sánh số mới varn với số cũ glo kết quả trong biến mới vừa được thêm vào.

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[:] 

đầu ra:

>>> a=10 
>>> func(a) 
a=10 
>>> b=20 
>>> func(20) 
b=20 
>>> foo='cat' 
>>> func(foo) 
foo=cat 
>>> bar=1000 
>>> func(bar) 
bar=1000 
3

Bạn có thể sử dụng inspect mô-đun (xem thêm this 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 
1

Tôi nghĩ rằng đây là giải pháp cần thiết của bạn:

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 

ví dụ nếu bạn khai báo một biến:

>>> c=55.6 

sau đó kết quả của printme (c) sẽ

>>> 'c = 55.6' 

Lưu ý: Giải pháp này được dựa trên kết hợp id duy nhất trên toàn cầu.

+0

điều này chỉ hoạt động nếu biến nằm trong 'globals', có nghĩa là nó vô ích đối với người dân địa phương ... – l4mpi

+0

@ l4mpi Theo câu hỏi được hỏi, một biến sẽ được chuyển đến một hàm. Điều này có nghĩa rằng, biến đó sẽ không nằm trong các hàm locals() của hàm đó nhưng trong các globals(). Vì vậy, tôi đã kiểm tra globals() đầu tiên. Điều này không thể là giải pháp chính xác nhưng tôi nghĩ rằng nó có thể cung cấp cho giải pháp cần thiết bằng cách sửa đổi ít tức là, kiểm tra người dân địa phương() đầu tiên. –

+0

điều này là sai và thể hiện sự hiểu biết kém của bạn về phạm vi biến. biến sẽ chỉ nằm trong 'globals' nếu nó được khai báo ở mức module (hoặc được khai báo một cách rõ ràng là global). nếu biến được khai báo bên trong của một hàm khác, nó sẽ không nằm trong 'globals' hay bên trong' local 'của hàm in - hãy thử' def f (x): printme (x) 'và sau đó gọi' f (1) '. xem câu trả lời catchmeifyoutrys cho một giải pháp thực tế bằng cách sử dụng người dân địa phương của phạm vi gọi. – l4mpi

Các vấn đề liên quan