2012-05-07 14 views
8

Việc sử dụng tên tệp được liên kết với một lớp cụ thể là gì? Ví dụ:Sử dụng tên kiểu lớp trong python

Point = namedtuple('P', ['x', 'y']) 

Bạn thường sử dụng tên tệp 'P' ở đâu?

Cảm ơn bạn!

+0

bản sao có thể có của [Tuples được đặt tên là gì "bằng Python?] (Http://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python) – b4hand

Trả lời

13

Chỉ vì lợi ích của sự tỉnh táo của, đối số đầu tiên để namedtuple nên được giống như tên biến bạn gán nó vào:

>>> from collections import namedtuple 
>>> Point = namedtuple('P','x y') 
>>> pp = Point(1,2) 
>>> type(pp) 
<class '__main__.P'> 

isinstance là không quá quan tâm về vấn đề này, mặc dù 'P' là chỉ là những gì không biết:

>>> isinstance(pp,Point) 
True 
>>> isinstance(pp,P) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'P' is not defined 

Nhưng dưa là một trong những mô-đun mà quan tâm đến việc tìm kiếm các classname phù hợp với typename:

>>> import pickle 
>>> ppp = pickle.dumps(pp) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "c:\python26\lib\pickle.py", line 1366, in dumps 
    Pickler(file, protocol).dump(obj) 
    File "c:\python26\lib\pickle.py", line 224, in dump 
    self.save(obj) 
    File "c:\python26\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "c:\python26\lib\pickle.py", line 401, in save_reduce 
    save(args) 
    File "c:\python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "c:\python26\lib\pickle.py", line 562, in save_tuple 
    save(element) 
    File "c:\python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "c:\python26\lib\pickle.py", line 748, in save_global 
    (obj, module, name)) 
pickle.PicklingError: Can't pickle <class '__main__.P'>: it's not found as __main__.P 

Nếu tôi xác định namedtuple là 'điểm', sau đó dưa là hạnh phúc:

>>> Point = namedtuple('Point','x y') 
>>> pp = Point(1,2) 
>>> ppp = pickle.dumps(pp) 
>>> 

Thật không may, đó là tùy thuộc vào bạn để quản lý thống nhất này. Không có cách nào để đặt tên để biết những gì bạn đang gán đầu ra của nó, vì gán là một câu lệnh chứ không phải một toán tử trong Python, vì vậy bạn phải chuyển tên lớp đúng vào têntuple, và gán lớp kết quả cho một biến giống nhau Tên.

+1

bạn không cần' .split() 'trên tên trường, đó là [được thực hiện tự động] (http://docs.python.org/library/collections#collections.namedtuple) nếu bạn chỉ định tên dưới dạng một chuỗi. nếu không +1 – mata

+0

Ah, cảm ơn! Tôi đã không sử dụng têntuple trong một thời gian, chỉ là bắt chước định dạng của OP. Tôi làm một cái gì đó rất giống với chức năng 'oneOf' của pyparsing. – PaulMcG

+3

Cũng có 'repr' mặc định: bạn muốn' Point (x = 1, y = 2) ', không phải' P (x = 1, y = 2) '. –

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