Hướng dẫn python get variable name in function - python lấy tên biến trong hàm

Có thể lấy tên biến ban đầu của một biến được truyền đến một hàm không? Ví dụ.

foobar = "foo"

def func[var]:
    print var.origname

Để có thể:

func[foobar]

Returns:

def log[soup]:
    f = open[varname+'.html', 'w']
    print >>f, soup.prettify[]
    f.close[]
4

EDIT:

Tất cả những gì tôi đang cố gắng làm là làm cho một chức năng như:

def log[soup]:
    f = open[varname+'.html', 'w']
    print >>f, soup.prettify[]
    f.close[]

.. và có chức năng tạo tên tệp từ tên của biến được truyền cho nó.

Tôi cho rằng nếu không thể tôi sẽ phải truyền biến và tên của biến như một chuỗi mỗi lần.

Khi được hỏi ngày 1 tháng 5 năm 2010 lúc 11:57May 1, 2010 at 11:57

AcornacornAcorn

47.5K26 Huy hiệu vàng129 Huy hiệu bạc171 Huy hiệu đồng26 gold badges129 silver badges171 bronze badges

3

Chỉnh sửa: Để làm rõ, tôi không khuyên bạn nên sử dụng điều này, nó sẽ bị phá vỡ, đó là một mớ hỗn độn, nó sẽ không giúp bạn bằng mọi cách, nhưng nó có thể thực hiện được cho mục đích giải trí/giáo dục. To make it clear, I don't recommend using this AT ALL, it will break, it's a mess, it won't help you in any way, but it's doable for entertainment/education purposes.

Bạn có thể hack xung quanh với mô -đun

def log[soup]:
    f = open[varname+'.html', 'w']
    print >>f, soup.prettify[]
    f.close[]
5, tôi không khuyên bạn nên làm điều đó, nhưng bạn có thể làm điều đó ...

import inspect

def foo[a, f, b]:
    frame = inspect.currentframe[]
    frame = inspect.getouterframes[frame][1]
    string = inspect.getframeinfo[frame[0]].code_context[0].strip[]
    args = string[string.find['['] + 1:-1].split[',']
    
    names = []
    for i in args:
        if i.find['='] != -1:
            names.append[i.split['='][1].strip[]]
        
        else:
            names.append[i]
    
    print names

def main[]:
    e = 1
    c = 2
    foo[e, 1000, b = c]

main[]

Output:

['e', '1000', 'c']

Falko

16.4K13 Huy hiệu vàng54 Huy hiệu bạc101 Huy hiệu đồng13 gold badges54 silver badges101 bronze badges

Đã trả lời ngày 1 tháng 5 năm 2010 lúc 12:13May 1, 2010 at 12:13

Ivo Wetzelivo WetzelIvo Wetzel

45,9K15 Huy hiệu vàng97 Huy hiệu bạc110 Huy hiệu đồng15 gold badges97 silver badges110 bronze badges

11

Để thêm vào câu trả lời của Michael Mrozek, bạn có thể trích xuất các tham số chính xác so với toàn bộ mã bằng cách:

import re
import traceback

def func[var]:
    stack = traceback.extract_stack[]
    filename, lineno, function_name, code = stack[-2]
    vars_name = re.compile[r'\[[.*?]\].*$'].search[code].groups[][0]
    print vars_name
    return

foobar = "foo"

func[foobar]

# PRINTS: foobar

Đã trả lời ngày 7 tháng 10 năm 2014 lúc 16:10Oct 7, 2014 at 16:10

propjk007propjk007propjk007

5958 Huy hiệu bạc18 Huy hiệu đồng8 silver badges18 bronze badges

1

Có vẻ như IVO đã đánh bại tôi đến

def log[soup]:
    f = open[varname+'.html', 'w']
    print >>f, soup.prettify[]
    f.close[]
5, nhưng đây là một triển khai khác:

import inspect

def varName[var]:
    lcls = inspect.stack[][2][0].f_locals
    for name in lcls:
        if id[var] == id[lcls[name]]:
            return name
    return None

def foo[x=None]:
    lcl='not me'
    return varName[x]

def bar[]:
    lcl = 'hi'
    return foo[lcl]

bar[]
# 'lcl'

Tất nhiên, nó có thể bị lừa:

def baz[]:
    lcl = 'hi'
    x='hi'
    return foo[lcl]

baz[]
# 'x'

Đạo đức: Đừng làm điều đó.

Đã trả lời ngày 1 tháng 5 năm 2010 lúc 12:22May 1, 2010 at 12:22

Outisoutisoutis

73.4K20 Huy hiệu vàng147 Huy hiệu bạc216 Huy hiệu đồng20 gold badges147 silver badges216 bronze badges

1

Bạn không thể. Nó được đánh giá trước khi được chuyển đến chức năng. Tất cả những gì bạn có thể làm là vượt qua nó như một chuỗi.

Đã trả lời ngày 1 tháng 5 năm 2010 lúc 12:01May 1, 2010 at 12:01

Max Shawabkehmax ShawabkehMax Shawabkeh

36,8K9 Huy hiệu vàng81 Huy hiệu bạc91 Huy hiệu Đồng9 gold badges81 silver badges91 bronze badges

4

Một cách khác bạn có thể thử nếu bạn biết mã gọi sẽ như thế nào là sử dụng

def log[soup]:
    f = open[varname+'.html', 'w']
    print >>f, soup.prettify[]
    f.close[]
7:

def func[var]:
    stack = traceback.extract_stack[]
    filename, lineno, function_name, code = stack[-2]

def log[soup]:
    f = open[varname+'.html', 'w']
    print >>f, soup.prettify[]
    f.close[]
8 sẽ chứa dòng mã được sử dụng để gọi
def log[soup]:
    f = open[varname+'.html', 'w']
    print >>f, soup.prettify[]
    f.close[]
9 [trong ví dụ của bạn, nó sẽ là chuỗi
import inspect

def foo[a, f, b]:
    frame = inspect.currentframe[]
    frame = inspect.getouterframes[frame][1]
    string = inspect.getframeinfo[frame[0]].code_context[0].strip[]
    args = string[string.find['['] + 1:-1].split[',']
    
    names = []
    for i in args:
        if i.find['='] != -1:
            names.append[i.split['='][1].strip[]]
        
        else:
            names.append[i]
    
    print names

def main[]:
    e = 1
    c = 2
    foo[e, 1000, b = c]

main[]
0]. Bạn có thể phân tích cú pháp đó để rút ra đối số

Đã trả lời ngày 28 tháng 4 năm 2012 lúc 7:09Apr 28, 2012 at 7:09

Michael Mrozekmichael MrozekMichael Mrozek

164K28 Huy hiệu vàng167 Huy hiệu bạc172 Huy hiệu đồng28 gold badges167 silver badges172 bronze badges

Câu trả lời của @ivo Wetzel hoạt động trong trường hợp gọi chức năng được thực hiện trong một dòng, như

e = 1 + 7
c = 3
foo[e, 100, b=c]

Trong trường hợp cuộc gọi hàm đó không nằm trong một dòng, như:

func[foobar]
0

Mã dưới đây hoạt động:

func[foobar]
1

Bạn sẽ nhận được:

func[foobar]
2

Nhưng vẫn vậy, điều này có thể phá vỡ.

Đã trả lời ngày 18 tháng 7 năm 2016 lúc 10:20Jul 18, 2016 at 10:20

AeonaeonAeon

891 Huy hiệu bạc4 Huy hiệu đồng1 silver badge4 bronze badges

Đối với hậu thế, đây là một số mã tôi đã viết cho nhiệm vụ này, nói chung tôi nghĩ rằng có một mô -đun bị thiếu trong Python để cung cấp cho mọi người kiểm tra tốt và mạnh mẽ về môi trường người gọi. Tương tự như những gì RLAng Eval Framework cung cấp cho R.

func[foobar]
3

Osamoele

3234 Huy hiệu bạc15 Huy hiệu Đồng4 silver badges15 bronze badges

Đã trả lời ngày 27 tháng 9 năm 2019 lúc 9:37Sep 27, 2019 at 9:37

Matt Oatesmatt OatesMatt Oates

7785 Huy hiệu bạc6 Huy hiệu Đồng5 silver badges6 bronze badges

2

Nếu bạn muốn một mối quan hệ cặp giá trị chính, có thể sử dụng từ điển sẽ tốt hơn?

... Hoặc nếu bạn đang cố gắng tạo một số tài liệu tự động từ mã của bạn, có lẽ một cái gì đó như doxygen [//www.doxygen.nl/] có thể làm công việc cho bạn?

Albert

7.6333 Huy hiệu vàng18 Huy hiệu bạc31 Huy hiệu đồng3 gold badges18 silver badges31 bronze badges

Đã trả lời ngày 1 tháng 5 năm 2010 lúc 12:06May 1, 2010 at 12:06

Nick Cartwrightnick CartwrightNick Cartwright

8.25415 Huy hiệu vàng44 Huy hiệu bạc56 Huy hiệu Đồng15 gold badges44 silver badges56 bronze badges

Bạn có thể sử dụng gói Python-Varname

func[foobar]
4

Output:

func[foobar]
5

Gói dưới đây:

//github.com/pwwang/python-varname

Đã trả lời ngày 17 tháng 1 năm 2021 lúc 9:20Jan 17, 2021 at 9:20

SynthaseSynthaseSynthase

5.3912 Huy hiệu vàng10 Huy hiệu bạc31 Huy hiệu đồng2 gold badges10 silver badges31 bronze badges

2

Tôi tự hỏi làm thế nào icecream giải quyết vấn đề này. Vì vậy, tôi đã xem xét mã nguồn và đưa ra giải pháp sau [hơi đơn giản]. Nó có thể không phải là 100% chống đạn [ví dụ: tôi đã bỏ

import inspect

def foo[a, f, b]:
    frame = inspect.currentframe[]
    frame = inspect.getouterframes[frame][1]
    string = inspect.getframeinfo[frame[0]].code_context[0].strip[]
    args = string[string.find['['] + 1:-1].split[',']
    
    names = []
    for i in args:
        if i.find['='] != -1:
            names.append[i.split['='][1].strip[]]
        
        else:
            names.append[i]
    
    print names

def main[]:
    e = 1
    c = 2
    foo[e, 1000, b = c]

main[]
1 và tôi cho rằng chính xác một đối số chức năng], nhưng nó hoạt động tốt cho các trường hợp thử nghiệm khác nhau. Nó không cần phải phân tích mã nguồn, vì vậy nó sẽ mạnh mẽ và đơn giản hơn các giải pháp trước đây.

func[foobar]
6

Output:

func[foobar]
7

Cập nhật: Nếu bạn muốn di chuyển "ma thuật" vào một chức năng riêng biệt, bạn chỉ cần phải quay lại một khung hình trở lại với một

import inspect

def foo[a, f, b]:
    frame = inspect.currentframe[]
    frame = inspect.getouterframes[frame][1]
    string = inspect.getframeinfo[frame[0]].code_context[0].strip[]
    args = string[string.find['['] + 1:-1].split[',']
    
    names = []
    for i in args:
        if i.find['='] != -1:
            names.append[i.split['='][1].strip[]]
        
        else:
            names.append[i]
    
    print names

def main[]:
    e = 1
    c = 2
    foo[e, 1000, b = c]

main[]
2 bổ sung.

func[foobar]
8

Đã trả lời ngày 15 tháng 5 năm 2021 lúc 10:34May 15, 2021 at 10:34

FalkofalkoFalko

16.4K13 Huy hiệu vàng54 Huy hiệu bạc101 Huy hiệu đồng13 gold badges54 silver badges101 bronze badges

1

Đã trả lời ngày 1 tháng 5 năm 2010 lúc 12:13

func[foobar]
9

Ivo Wetzelivo Wetzel

def log[soup]:
    f = open[varname+'.html', 'w']
    print >>f, soup.prettify[]
    f.close[]
0

45,9K15 Huy hiệu vàng97 Huy hiệu bạc110 Huy hiệu đồng

def log[soup]:
    f = open[varname+'.html', 'w']
    print >>f, soup.prettify[]
    f.close[]
1

Để thêm vào câu trả lời của Michael Mrozek, bạn có thể trích xuất các tham số chính xác so với toàn bộ mã bằng cách:Feb 21, 2020 at 18:31

1

Đã trả lời ngày 7 tháng 10 năm 2014 lúc 16:10

def log[soup]:
    f = open[varname+'.html', 'w']
    print >>f, soup.prettify[]
    f.close[]
2

Đã trả lời ngày 19 tháng 3 năm 2019 lúc 0:51Mar 19, 2019 at 0:51

CamioncamionCamion

1.1447 Huy hiệu bạc21 Huy hiệu đồng7 silver badges21 bronze badges

Nếu nó xảy ra như vậy là biến có thể gọi được [hàm], nó sẽ có thuộc tính

import inspect

def foo[a, f, b]:
    frame = inspect.currentframe[]
    frame = inspect.getouterframes[frame][1]
    string = inspect.getframeinfo[frame[0]].code_context[0].strip[]
    args = string[string.find['['] + 1:-1].split[',']
    
    names = []
    for i in args:
        if i.find['='] != -1:
            names.append[i.split['='][1].strip[]]
        
        else:
            names.append[i]
    
    print names

def main[]:
    e = 1
    c = 2
    foo[e, 1000, b = c]

main[]
3.

Ví dụ. một trình bao bọc để ghi lại thời gian thực hiện của một hàm:

def log[soup]:
    f = open[varname+'.html', 'w']
    print >>f, soup.prettify[]
    f.close[]
3

Đã trả lời ngày 13 tháng 1 lúc 4:45Jan 13 at 4:45

David Gilbertsondavid GilbertsonDavid Gilbertson

3.7901 Huy hiệu vàng21 Huy hiệu bạc 30 Huy hiệu Đồng1 gold badge21 silver badges30 bronze badges

1

Làm thế nào để bạn tìm thấy biến của một hàm trong Python?

Sử dụng cú pháp thuộc tính đối tượng để truy cập một biến bên ngoài hàm. Trong một chức năng có tên Func, sử dụng Func cú pháp. Biến = giá trị để lưu trữ giá trị trong biến như một thuộc tính của func. Để truy cập giá trị bên ngoài func, sử dụng func [] để chạy func, sau đó sử dụng chức năng cú pháp_name. to access a variable outside of a function. In a function named func , use the syntax func. variable = value to store value in variable as an attribute of func . To access value outside of func , use func[] to run func , then use the syntax function_name.

Tôi có thể lấy tên biến trong Python không?

Để có được tên của một biến làm chuỗi: sử dụng hàm Globals [] để có được một từ điển thực hiện không gian tên mô -đun hiện tại.Lặp lại từ điển để có được tên biến phù hợp.Truy cập mục danh sách tại INDEX 0 để lấy tên của biến.

Làm cách nào để nhận được giá trị của một biến trong Python?

Python Biến các giá trị lưu trữ trong một chương trình.Bạn có thể tham khảo tên của một biến để truy cập giá trị của nó.Giá trị của một biến có thể được thay đổi trong suốt chương trình của bạn.Các biến được khai báo bằng cú pháp này: name = value.refer to the name of a variable to access its value. The value of a variable can be changed throughout your program. Variables are declared using this syntax: name = value.

Tên biến có thể giống như tên hàm python không?

Điểm mấu chốt: Bạn không thể có hai thứ đồng thời cùng tên, có thể là hàm, số nguyên hoặc bất kỳ đối tượng nào khác trong Python.Chỉ cần sử dụng một tên khác.you can't have two things simultaneously with the same name, be it a function, an integer, or any other object in Python. Just use a different name.

Bài Viết Liên Quan

Chủ Đề