2015-05-24 19 views
6

Cách đánh giá công việc + 5 (cảnh báo spoiler: kết quả là 5)?Làm cách nào để đánh giá +5 bằng Python?

Không phải là + có hoạt động bằng cách gọi phương thức __add__ về điều gì đó không? 5 sẽ là "other" trong:

>>> other = 5 
>>> x = 1 
>>> x.__add__(other) 
6 

Vậy "khoảng trống" cho phép thêm 5 là gì?

void.__add__(5)

đầu mối khác là:

/ 5 

ném lỗi:

TypeError: 'int' object is not callable 
+3

'LoạiError' thứ hai phải làm với tính năng tự động ngoặc đơn IPython, nó thay thế'/whatever' bằng 'whatever()'. Python không có toán tử '/' đơn nhất. – bereal

+0

@bereal Bất kỳ liên kết nào đến tính năng này? Nó không chỉ là dấu ngoặc đơn tự động: '/ sum (1 2 3 4 5)' trả về 15. –

+0

@AshwiniChaudhary được mô tả [ở đây] (https://ipython.org/ipython-doc/dev/interactive/reference.html # automatic-parentheses-and-quotes), (giống như IPython's '?' -help). Rõ ràng, nó cao hơn một chút, hơn được mô tả, ví dụ, '/ 'abc'' trả về'' abc'', tôi không biết nó có nghĩa là gì. – bereal

Trả lời

7

Các + trong trường hợp này gọi phương thức unary diệu __pos__ hơn __add__:

>>> class A(int): 
    def __pos__(self): 
     print '__pos__ called' 
     return self 
... 
>>> a = A(5) 
>>> +a 
__pos__ called 
5 
>>> +++a 
__pos__ called 
__pos__ called 
__pos__ called 
5 

Python chỉ hỗ trợ 4 (phép tính số học unary) trong số họ __neg__, __pos__, __abs__, và __invert__, vì thế mà SyntaxError với /. Lưu ý rằng __abs__ hoạt động với chức năng tích hợp được gọi là abs(), nghĩa là không có toán tử nào cho hoạt động đơn nhất này.


Lưu ý rằng /5 (/ tiếp theo một cái gì đó) được hiểu khác nhau bởi IPython vỏ mà thôi, cho vỏ bình thường nó là một lỗi cú pháp như mong đợi:

Ashwinis-MacBook-Pro:py ashwini$ ipy 
Python 2.7.6 (default, Sep 9 2014, 15:04:36) 
Type "copyright", "credits" or "license" for more information. 

IPython 3.0.0 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 
>>> /5 
Traceback (most recent call last): 
    File "<ipython-input-1-2b14d13c234b>", line 1, in <module> 
    5() 
TypeError: 'int' object is not callable 

>>> /float 1 
1.0 
>>> /sum (1 2 3 4 5) 
15 

Ashwinis-MacBook-Pro:~ ashwini$ python 
Python 2.7.6 (default, Sep 9 2014, 15:04:36) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> /5 
    File "<stdin>", line 1 
    /5 
    ^
SyntaxError: invalid syntax 
>>> /float 1 
    File "<stdin>", line 1 
    /float 1 
    ^
SyntaxError: invalid syntax 
+0

Không chắc chắn lý do bạn bao gồm '__abs__' cùng với 3 – wim

+0

@wim' __abs__' khác không có toán tử đơn nhất nhưng nó vẫn được coi là một hoạt động đơn nhất. –

+0

Tôi không nghĩ rằng bạn đang đúng về điều đó - [tài liệu xác định] (https://docs.python.org/2/reference/expressions.html#unary-arithmetic-and-bitwise-operations) rõ ràng là một ' u_expr' và chỉ đề cập đến các hoạt động trừ, cộng, và nghịch đảo. Tại sao bạn sẽ gọi 'int .__ abs__' một hoạt động đơn nhất nhưng không, nói,' int .__ nonzero__' hoặc những người khác ?? – wim

6

mỗi sự language reference on numeric literals:

Note that numeric literals do not include a sign; a phrase like -1 is actually an expression composed of the unary operator - and the literal 1 .

section on unary operators:

The unary - (minus) operator yields the negation of its numeric argument.

The unary + (plus) operator yields its numeric argument unchanged.

Không có nhà điều hành độc lập, do đó xảy ra lỗi.

Các liên quan "magic method" (__pos__, __neg__) đều được bao phủ trong the data model documentation.

+0

Tôi hiểu ... lời giải thích giờ đây đã khiến tôi đánh giá '- +++ - 1', sau đó nó hoạt động hợp lý. – PascalVKooten

+0

@PascalvKooten có, bạn có thể chuỗi chúng một cách tùy tiện – jonrsharpe

+2

Lưu ý rằng '/' thực sự là một 'Cú pháp Cú pháp ', đó là vỏ IPython làm điều gì đó sôi nổi với'/'. –

7

Có vẻ như bạn đã tìm thấy một trong ba số unary operators:

  • Hoạt động cộng thêm đơn nhất +x gọi phương thức __pos __().
  • Hoạt động phủ định đơn nhất -x gọi phương thức __neg __().
  • Hoạt động unary un (hoặc invert) ~x gọi phương thức __invert __().
Các vấn đề liên quan