Hướng dẫn get parameter value by name python - nhận giá trị tham số theo tên python

Hãy xem mô -đun

a_method.func_code.co_argcount
2 - Điều này sẽ thực hiện kiểm tra các thuộc tính đối tượng mã khác nhau cho bạn.

>>> inspect.getfullargspec(a_method)
(['arg1', 'arg2'], None, None, None)

Các kết quả khác là tên của các biến *args và ** kwargs và các mặc định được cung cấp. I E.

>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))

Lưu ý rằng một số thiết bị gọi có thể không thể hướng nội trong một số triển khai của Python. Ví dụ, trong CPython, một số hàm tích hợp được xác định trong C không cung cấp siêu dữ liệu về các đối số của họ. Do đó, bạn sẽ nhận được

a_method.func_code.co_argcount
3 nếu bạn sử dụng
a_method.func_code.co_argcount
4 trên chức năng tích hợp.

Vì Python 3.3, bạn có thể sử dụng

a_method.func_code.co_argcount
5 để xem chữ ký cuộc gọi của một đối tượng có thể gọi được:

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>

Đã trả lời ngày 20 tháng 10 năm 2008 lúc 14:52Oct 20, 2008 at 14:52

Hướng dẫn get parameter value by name python - nhận giá trị tham số theo tên python

BrianbrianBrian

Huy hiệu vàng 115K2828 gold badges107 silver badges111 bronze badges

11

Trong cpython, số lượng đối số là

a_method.func_code.co_argcount

và tên của họ đang ở đầu

a_method.func_code.co_varnames

Đây là những chi tiết triển khai của Cpython, vì vậy điều này có thể không hoạt động trong các triển khai khác của Python, chẳng hạn như Ironpython và Jython.

Một cách di động để thừa nhận các đối số "thông qua" là xác định chức năng của bạn với chữ ký

a_method.func_code.co_argcount
6. Điều này được sử dụng rất nhiều trong ví dụ: Matplotlib, trong đó lớp API bên ngoài chuyển rất nhiều đối số từ khóa đến API cấp thấp hơn.

Đã trả lời ngày 20 tháng 10 năm 2008 lúc 14:24Oct 20, 2008 at 14:24

5

Phiên bản Python 3 là:

def _get_args_dict(fn, args, kwargs):
    args_names = fn.__code__.co_varnames[:fn.__code__.co_argcount]
    return {**dict(zip(args_names, args)), **kwargs}

Phương pháp trả về một từ điển chứa cả Args và Kwargs.

Hướng dẫn get parameter value by name python - nhận giá trị tham số theo tên python

Đã trả lời ngày 1 tháng 11 năm 2016 lúc 15:45Nov 1, 2016 at 15:45

Hướng dẫn get parameter value by name python - nhận giá trị tham số theo tên python

Argaenargaenargaen

4.00523 Huy hiệu bạc28 Huy hiệu đồng23 silver badges28 bronze badges

4

Trong một phương pháp trang trí, bạn có thể liệt kê các đối số của phương pháp ban đầu theo cách này:

import inspect, itertools 

def my_decorator():

        def decorator(f):

            def wrapper(*args, **kwargs):

                # if you want arguments names as a list:
                args_name = inspect.getargspec(f)[0]
                print(args_name)

                # if you want names and values as a dictionary:
                args_dict = dict(itertools.izip(args_name, args))
                print(args_dict)

                # if you want values as a list:
                args_values = args_dict.values()
                print(args_values)

Nếu

a_method.func_code.co_argcount
7 rất quan trọng đối với bạn, thì nó sẽ hơi phức tạp:

        def wrapper(*args, **kwargs):

            args_name = list(OrderedDict.fromkeys(inspect.getargspec(f)[0] + kwargs.keys()))
            args_dict = OrderedDict(list(itertools.izip(args_name, args)) + list(kwargs.iteritems()))
            args_values = args_dict.values()

Example:

@my_decorator()
def my_function(x, y, z=3):
    pass


my_function(1, y=2, z=3, w=0)
# prints:
# ['x', 'y', 'z', 'w']
# {'y': 2, 'x': 1, 'z': 3, 'w': 0}
# [1, 2, 3, 0]

Đã trả lời ngày 14 tháng 5 năm 2013 lúc 11:36May 14, 2013 at 11:36

Mehdi Behroozmehdi BehroozMehdi Behrooz

2.7401 Huy hiệu vàng16 Huy hiệu bạc6 Huy hiệu đồng1 gold badge16 silver badges6 bronze badges

2

Tôi nghĩ những gì bạn đang tìm kiếm là phương pháp của người dân địa phương -


In [6]: def test(a, b):print locals()
   ...: 

In [7]: test(1,2)              
{'a': 1, 'b': 2}

Đã trả lời ngày 7 tháng 6 năm 2010 lúc 16:37Jun 7, 2010 at 16:37

DamiandamianDamian

2.54822 Huy hiệu bạc19 Huy hiệu đồng22 silver badges19 bronze badges

2

Python 3.5+:

DEVENTWARNING: Kiểm tra.getArgSpec () không được dùng từ Python 3.0, sử dụng kiểm tra.signature () hoặc kiểm tra.getfullargspec ()

Vì vậy, trước đây:

>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))
0

Now:

>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))
1

Để kiểm tra:

>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))
2

Cho rằng chúng ta có chức năng 'hàm' lấy đối số 'arg', điều này sẽ đánh giá là đúng, nếu không là sai.

Ví dụ từ bảng điều khiển Python:

>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))
3

Dave Liu

7011 Huy hiệu vàng9 Huy hiệu bạc28 Huy hiệu đồng1 gold badge9 silver badges28 bronze badges

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

Peter Majkopeter MajkoPeter Majko

1.1719 huy hiệu bạc22 Huy hiệu đồng9 silver badges22 bronze badges

1

Đây là một cái gì đó tôi nghĩ sẽ làm việc cho những gì bạn muốn, sử dụng một người trang trí.

>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))
4

Chạy nó, nó sẽ mang lại đầu ra sau:

>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))
5

Đã trả lời ngày 21 tháng 10 năm 2008 lúc 0:02Oct 21, 2008 at 0:02

Hướng dẫn get parameter value by name python - nhận giá trị tham số theo tên python

Hlzrhlzrhlzr

3681 Huy hiệu bạc7 Huy hiệu đồng1 silver badge7 bronze badges

Trong Python 3.+ với đối tượng

a_method.func_code.co_argcount
8 trong tay, một cách dễ dàng để có được ánh xạ giữa các tên đối số đến các giá trị, là sử dụng phương thức
a_method.func_code.co_argcount
9 của chữ ký!

Ví dụ, đây là một người trang trí để in bản đồ như thế:

>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))
6

Hướng dẫn get parameter value by name python - nhận giá trị tham số theo tên python

Đã trả lời ngày 20 tháng 8 năm 2017 lúc 12:09Aug 20, 2017 at 12:09

Kfir Eisnerkfir EisnerKfir Eisner

4135 Huy hiệu bạc3 Huy hiệu Đồng5 silver badges3 bronze badges

Dưới đây là một cách khác để có được các tham số chức năng mà không cần sử dụng bất kỳ mô -đun nào.

>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))
7

Output:

>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))
8

Đã trả lời ngày 6 tháng 8 năm 2019 lúc 10:12Aug 6, 2019 at 10:12

Hướng dẫn get parameter value by name python - nhận giá trị tham số theo tên python

Dildeolupbitendildeolupbitendildeolupbiten

1.2851 Huy hiệu vàng14 Huy hiệu bạc26 Huy hiệu đồng1 gold badge14 silver badges26 bronze badges

a_method.func_code.co_varnames
0 rất chậm. Cách nhanh nhất là

>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))
9

Đã trả lời ngày 21 tháng 8 năm 2019 lúc 18:29Aug 21, 2019 at 18:29

1

Trả về một danh sách các tên đối số, chăm sóc các phần và các chức năng thường xuyên:

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
0

Đã trả lời ngày 30 tháng 5 năm 2017 lúc 11:52May 30, 2017 at 11:52

Loveshloveshlovesh

5.1637 Huy hiệu vàng60 Huy hiệu bạc92 Huy hiệu Đồng7 gold badges60 silver badges92 bronze badges

Cập nhật câu trả lời của Brian:

Nếu một hàm trong Python 3 có các đối số chỉ có từ khóa, thì bạn cần sử dụng

a_method.func_code.co_varnames
1:

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
1

năng suất này:

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
2

Hướng dẫn get parameter value by name python - nhận giá trị tham số theo tên python

Đã trả lời ngày 22 tháng 3 năm 2017 lúc 10:45Mar 22, 2017 at 10:45

Trong Python 3, bên dưới là biến

a_method.func_code.co_varnames
2 và
a_method.func_code.co_argcount
7 thành
a_method.func_code.co_varnames
4 (sử dụng
a_method.func_code.co_varnames
5 cho Python <3.6 để duy trì các đơn đặt hàng
a_method.func_code.co_varnames
4):

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
3

Đã trả lời ngày 11 tháng 12 năm 2018 lúc 0:56Dec 11, 2018 at 0:56

Hướng dẫn get parameter value by name python - nhận giá trị tham số theo tên python

AlphaalphaAlpha

2.2623 Huy hiệu vàng20 Huy hiệu bạc22 Huy hiệu Đồng3 gold badges20 silver badges22 bronze badges

Câu trả lời dễ đọc đơn giản như của Python 3.0 trở đi:

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
4

Đã trả lời ngày 22 tháng 3 lúc 0:24Mar 22 at 0:24

Để cập nhật một chút câu trả lời của Brian, giờ đây có một bản backport tuyệt vời mà bạn có thể sử dụng trong các phiên bản Python cũ hơn:

a_method.func_code.co_varnames
8. Vì vậy, sở thích cá nhân của tôi sẽ diễn ra

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
5

Để giải trí, nếu bạn quan tâm đến việc chơi với các đối tượng

a_method.func_code.co_argcount
8 và thậm chí tạo các chức năng với chữ ký ngẫu nhiên một cách linh hoạt, bạn có thể xem dự án
def _get_args_dict(fn, args, kwargs):
    args_names = fn.__code__.co_varnames[:fn.__code__.co_argcount]
    return {**dict(zip(args_names, args)), **kwargs}
0 của tôi.

Đã trả lời ngày 14 tháng 3 năm 2019 lúc 10:49Mar 14, 2019 at 10:49

Hướng dẫn get parameter value by name python - nhận giá trị tham số theo tên python

smariesmariesmarie

4,00421 Huy hiệu bạc34 Huy hiệu đồng21 silver badges34 bronze badges

Cách dễ nhất để thao tác các tham số của một số chức năng:

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
6

Result:

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
7

Làm theo cách này sẽ thậm chí còn dễ dàng hơn vì bạn nhận được một cái cụ thể:

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
8

Result:

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
9

Đã trả lời ngày 25 tháng 7 lúc 19:10Jul 25 at 19:10

Tôi đã tìm kiếm cách in tên chức năng và các đối số được cung cấp cho một bài tập tôi phải tạo một bộ trang trí để in chúng và tôi đã sử dụng nó:

a_method.func_code.co_argcount
0

Đã trả lời ngày 8 tháng 9 năm 2021 lúc 17:29Sep 8, 2021 at 17:29

Hướng dẫn get parameter value by name python - nhận giá trị tham số theo tên python

Có thể sử dụng API

a_method.func_code.co_argcount
2 để đọc giá trị đối số không đổi
def _get_args_dict(fn, args, kwargs):
    args_names = fn.__code__.co_varnames[:fn.__code__.co_argcount]
    return {**dict(zip(args_names, args)), **kwargs}
2 từ Func Lambda
def _get_args_dict(fn, args, kwargs):
    args_names = fn.__code__.co_varnames[:fn.__code__.co_argcount]
    return {**dict(zip(args_names, args)), **kwargs}
3 trong mã bên dưới không?

a_method.func_code.co_argcount
1

Đã trả lời ngày 29 tháng 10 năm 2021 lúc 1:09Oct 29, 2021 at 1:09

x4444x4444x4444

2.0231 Huy hiệu vàng13 Huy hiệu bạc9 Huy hiệu đồng1 gold badge13 silver badges9 bronze badges

Còn

def _get_args_dict(fn, args, kwargs):
    args_names = fn.__code__.co_varnames[:fn.__code__.co_argcount]
    return {**dict(zip(args_names, args)), **kwargs}
4 và
def _get_args_dict(fn, args, kwargs):
    args_names = fn.__code__.co_varnames[:fn.__code__.co_argcount]
    return {**dict(zip(args_names, args)), **kwargs}
5 thì sao?

Có vẻ như đang làm chính xác những gì đang được hỏi Super chỉ đơn giản là

Phải được gọi từ bên trong phạm vi chức năng.

Nhưng hãy cảnh giác rằng nó sẽ trả về tất cả các biến cục bộ, vì vậy hãy chắc chắn thực hiện nó ngay từ đầu của hàm nếu cần.

Cũng lưu ý rằng, như đã chỉ ra trong các bình luận, điều này không cho phép nó được thực hiện từ bên ngoài phạm vi.Vì vậy, không chính xác kịch bản của OP nhưng vẫn phù hợp với tiêu đề câu hỏi.Do đó câu trả lời của tôi.

Đã trả lời ngày 7 tháng 1 năm 2017 lúc 21:34Jan 7, 2017 at 21:34

Jeromejjeromejjeromej

9.3622 Huy hiệu vàng42 Huy hiệu bạc62 Huy hiệu Đồng2 gold badges42 silver badges62 bronze badges

1