2012-01-10 28 views
5

Làm cách nào tôi có thể truy cập theo lập trình các giá trị đối số mặc định của một phương thức bằng Python? Ví dụ: trongTruy cập các giá trị đối số mặc định trong Python

def test(arg1='Foo'): 
    pass 

làm cách nào tôi có thể truy cập chuỗi 'Foo' bên trong test?

+1

bạn có thể cung cấp một ví dụ chứng minh lý do tại sao bạn có thể muốn làm điều đó? – Kevin

+0

Bạn có nghĩa là KHÔNG chỉ cần gõ 'arg1'? –

+0

Nếu bạn không cung cấp 'arg1' khi gọi' test', thì 'arg1' sẽ mặc định thành' 'Foo'' – TyrantWave

Trả lời

14

Họ là s tored trong test.func_defaults

+0

+1: điều này! nó hoạt động. –

2

Ricardo Cárdenes đang đi đúng hướng. Trên thực tế, việc truy cập chức năng testbên trongtest sẽ phức tạp hơn rất nhiều. Các module inspect sẽ giúp bạn có thêm, nhưng nó sẽ là xấu xí: Python code to get current function into a variable?

Khi nó quay ra, bạn có thể tham khảo test bên trong hàm:

def test(arg1='foo'): 
    print test.__defaults__[0] 

sẽ in ra foo. Nhưng đề cập đến test sẽ chỉ làm việc, miễn là test là thực sự định nghĩa:

>>> test() 
foo 
>>> other = test 
>>> other() 
foo 
>>> del test 
>>> other() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in test 
NameError: global name 'test' is not defined 

Vì vậy, nếu bạn có ý định trên qua chức năng này xung quanh, bạn có thể thực sự phải đi con đường inspect :(

+0

Tôi cũng nằm trong ấn tượng đó, chỉ ra rằng 'test' nằm trong phạm vi địa phương của' test' như đã chỉ ra trong bình luận của Ricardo về câu trả lời của tôi. –

+0

tuyệt vời để biết! cập nhật câu trả lời của tôi để phản ánh điều đó! –

+1

Nếu chúng ta thực hiện 'def test2(): in locals(), '\ n \ n', globals()', ta thấy 'test2' nằm trong các hình cầu, và không có gì ở người dân địa phương. –

0

này không phải là rất thanh lịch (ở tất cả), nhưng nó làm những gì bạn muốn:.

def test(arg1='Foo'): 
    print(test.__defaults__) 

test(arg1='Bar') 

trình với Python 3.x quá

+2

Tại sao 'globals()'? 'test' là địa phương trong phạm vi riêng của nó, không cần điều đó. –

+0

@ RicardoCárdenes, bạn nói đúng. Tôi không biết điều đó, cảm ơn bạn. Sửa nó ngay bây giờ. –

4

xem xét:

def test(arg1='Foo'): 
    pass 

In [48]: test.func_defaults 
Out[48]: ('Foo',) 

.func_defaults cung cấp cho bạn các giá trị mặc định, như là một chuỗi, theo thứ tự mà các đối số xuất hiện trong mã của bạn.

Rõ ràng, func_defaults có thể đã được loại bỏ trong python 3.

+4

Tôi nghĩ 'func_defaults' chỉ hoạt động trên Python 2.x. '__defaults__' dường như hoạt động trên Python 2.7 và 3.2. –

+0

@RobWouters: tốt để biết, mặc dù tôi không bao giờ sử dụng python 3. – Marcin

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