2012-02-29 81 views
10

Tôi đang tìm cách tạo từ điển mà không cần viết khóa rõ ràng Tôi muốn tạo hàm có biến số và tạo từ điển có tên biến là khóa và giá trị của chúng là biến giá trịtạo từ điển từ danh sách biến

Thay vì viết các chức năng sau:

def foo(): 
    first_name = "daniel" 
    second_name = "daniel" 
    id = 1 
    return {'first_name':first_name, 'second_name':second_name} 

tôi muốn có được kết quả tương tự với chức năng:

create_dict_from_variables(first_name, second_name) 

là có anyway để làm như vậy?

Trả lời

2

Bạn không thể thực hiện việc này.

Chức năng của bạn có thể được định nghĩa là:

def create_dict_from_variables(first_name, second_name): 
    return something_from(first_name, second_name) 

và bạn có thể gọi chức năng này:

create_dict_from_variables('abcd', 'efgh') 

hai đối Những 'abcd''efgh' không được đặt tên biến.

4

Bạn có thể sử dụng locals, nhưng tôi khuyên bạn nên chống lại nó. Làm điều đó một cách rõ ràng.

>>> import this 
[...] 
Explicit is better than implicit. 
[...] 

Mã của bạn nói chung sẽ tốt hơn, dễ dự đoán hơn, ít bị phá vỡ và dễ hiểu hơn nếu bạn làm điều đó một cách rõ ràng.

+1

Tư tưởng về người dân địa phương, nhưng tôi không muốn truyền xung quanh nhiều biến tạm thời – user1087310

+0

@ user1087310: sau đó, bạn đã nghĩ về khả năng duy nhất có. Bây giờ bạn đã bỏ đi điều đó, biết rằng không có cách nào để làm điều đó; làm điều đó một cách rõ ràng và tận hưởng! –

+0

Đã một thời gian dài kể từ khi tôi giải quyết một cái gì đó mà tôi không thể làm trong python. Tôi đang viết vài hàm cần trả lại số lượng lớn các parmeters cho các hàm khác.từ điển được trả về gần giống với tên biến, vì vậy tôi có cơ hội cao để tạo lỗi đánh máy khi tôi viết khóa một cách rõ ràng. Nhưng ông tôi đã nói với tôi một khi cuộc sống không dễ dàng :) – user1087310

1

Không, không có, vì hàm Python không nhận được thông tin về các biến được sử dụng để gọi hàm. Ngoài ra, hãy tưởng tượng làm điều gì đó như sau:

create_dict_from_variables(first_name[:-3] + "moo", last_name[::2]) 

Hàm sẽ không có cách nào để biết biểu thức được sử dụng để tạo tham số.

10

Bạn không thể làm điều đó mà không cần viết ít nhất là tên biến, nhưng một cách viết tắt có thể được viết như thế này:

>>> foo = 1 
>>> bar = 2 
>>> d = dict(((k, eval(k)) for k in ('foo', 'bar'))) 
>>> d 
{'foo': 1, 'bar': 2} 

hoặc như là một chức năng:

def createDict(*args): 
    return dict(((k, eval(k)) for k in args)) 

>>> createDict('foo','bar') 
{'foo': 1, 'bar': 2} 

bạn cũng có thể sử dụng globals() thay vì eval():

>>> dict(((k, globals()[k]) for k in ('foo', 'bar'))) 
0

Về nguyên tắc, đây là tài sản bằng cách chuyển các tên biến thành hàm create_dict và sau đó tiếp cận với khung ngăn xếp người gọi từ bên trong create_dict chức năng sử dụng mô-đun inspect.

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