Hướng dẫn numeric coercion rules in python - quy tắc cưỡng chế số trong python

Sign in to your Python Morsels account to save your screencast settings.

Don't have an account yet? Sign up here.

Many programming languages have something called type coercion; it's where the language will implicitly convert one object to another type of object in certain circumstances.

Python does not have type coercion.

Numeric Types and Coercion

If we add together an integer (2) and a floating-point number (3.5) in Python, we'll get back a floating-point number:

>>> x = 2
>>> y = 3.5
>>> x + y
5.5

Python did not coerce the integer into a floating-point number; we don't have type coercion in Python. Instead, Python delegated to the integer and floating point numbers and asked those objects to add themselves together.

Whenever Python sees x + y, it calls the __add__ method on x passing y to it:

>>> x.__add__(y)
NotImplemented

In this case Python got

>>> x.__add__(y)
NotImplemented
0 back because integers don't know how to add themselves to floating-point numbers. This special
>>> x.__add__(y)
NotImplemented
0 value was returned by the__add__ method of the integer object to let Python know that x (an
>>> x.__add__(y)
NotImplemented
4) doesn't know how to support the
>>> x.__add__(y)
NotImplemented
5 operator with y (a
>>> x.__add__(y)
NotImplemented
7).

When Python sees this special

>>> x.__add__(y)
NotImplemented
0 value, it then attempts to ask y whether it knows how to add itself to x. To do this Python call the
>>> name = "Trey"
>>> x
2
>>> name + x
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
1 method on y, passing it x:

This adds the floating-point number to the integer from the right-hand side of the plus sign (

>>> name = "Trey"
>>> x
2
>>> name + x
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
4 is for "right" in
>>> name = "Trey"
>>> x
2
>>> name + x
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
1) and returns
>>> name = "Trey"
>>> x
2
>>> name + x
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
6.

So no type coercion was done here, instead, one of these types of objects knows how to operate with the other type of object when used with the plus operator.

Python Objects Don't Support Type Coercion

A counterexample of this is strings.

What happens if we try to use the

>>> x.__add__(y)
NotImplemented
5 operator between a string and a number in Python?

>>> name = "Trey"
>>> x
2
>>> name + x
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str

Many programming languages would make the string

>>> name = "Trey"
>>> x
2
>>> name + x
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
8 above: they would concatenate that string and that number, by coercing the number into the string. In Python, we get an error instead (see [TypeError: can only concatenate str (not "int") to str][concat str] for more on that specific error).

The reason is that strings in Python don't know how to use the plus operator with numbers and numbers in Python don't know how to use the plus operator with strings, which means our code doesn't work.

So to actually accomplish what we're looking for, we need to explicitly convert the number to a string:

>>> name + str(x)
'Trey2'

We've made a new string out of that number 2, and we're concatenating it to our string

>>> name + str(x)
'Trey2'
0 to get another string.

Summary

Python don't have type coercion. Python doesn't ever implicitly converts one object to another type of object.

You'll always either rely on at least one of the objects you're working with knowing how to operate with the other type of object or you'll have to explicitly convert one of your objects to another type of object.

Phần này được sử dụng để ghi lại các quy tắc cho sự ép buộc. Khi ngôn ngữ đã phát triển, các quy tắc cưỡng chế đã trở nên khó ghi lại chính xác; Tài liệu về những gì một phiên bản của một triển khai cụ thể là không mong muốn. Thay vào đó, đây là một số hướng dẫn không chính thức liên quan đến sự ép buộc. Trong Python 3.0, sự ép buộc sẽ không được hỗ trợ.

  • Nếu toán hạng bên trái của toán tử % là đối tượng chuỗi hoặc Unicode, thay vào đó, không có sự ép buộc nào và hoạt động định dạng chuỗi được gọi thay thế.

  • Nó không còn được khuyến nghị xác định hoạt động ép buộc. Các hoạt động chế độ hỗn hợp trên các loại không xác định sự ép buộc chuyển các đối số gốc cho hoạt động.

  • Các lớp kiểu mới (những lớp có nguồn gốc từ đối tượng) không bao giờ gọi phương thức __Coerce __ () để đáp ứng với toán tử nhị phân; Lần duy nhất __Coerce __ () được gọi là khi hàm tích hợp tích hợp () được gọi.

  • Đối với hầu hết các ý định và mục đích, một nhà điều hành trả về

    >>> x.__add__(y)
    NotImplemented
    
    0 được đối xử giống như một người không được thực hiện.

  • Dưới đây, __op __ () và __rop __ () được sử dụng để biểu thị các tên phương thức chung tương ứng với toán tử; __IOP __ () được sử dụng cho toán tử tại chỗ tương ứng. Ví dụ: đối với toán tử `

    >>> x.__add__(y)
    NotImplemented
    
    5 ', __add __ () và __radd __ () được sử dụng cho biến thể bên trái và bên phải của toán tử nhị phân và __iadd __ () cho biến thể tại chỗ.

  • Đối với các đối tượng X và Y, đầu tiên

    >>> name + str(x)
    'Trey2'
    
    3 được thử. Nếu điều này không được thực hiện hoặc trả lại
    >>> x.__add__(y)
    NotImplemented
    
    0,
    >>> name + str(x)
    'Trey2'
    
    5 sẽ được thử. Nếu điều này cũng không được triển khai hoặc trả lại
    >>> x.__add__(y)
    NotImplemented
    
    0, một ngoại lệ kiểu loại sẽ được nâng lên. Nhưng xem ngoại lệ sau:

  • Ngoại lệ đối với mục trước: Nếu toán hạng bên trái là một thể hiện của một loại tích hợp hoặc một lớp kiểu mới, và toán hạng bên phải là một thể hiện của một lớp con thích hợp của loại hoặc lớp đó, phương thức __rop __ () của toán hạng bên phải được thử trước phương thức __op __ () của toán hạng bên trái. Điều này được thực hiện để một lớp con có thể ghi đè hoàn toàn các toán tử nhị phân. Mặt khác, phương thức __op__ của toán hạng bên trái sẽ luôn chấp nhận toán hạng bên phải: khi một phiên bản của một lớp nhất định được dự kiến, một thể hiện của một lớp con của lớp đó luôn được chấp nhận.

  • Khi loại toán hạng định nghĩa cưỡng chế, sự ép buộc này được gọi trước khi loại __op __ () hoặc __rop __ () phương thức được gọi, nhưng không sớm hơn. Nếu sự ép buộc trả về một đối tượng thuộc loại khác cho toán hạng có sự ép buộc được gọi, một phần của quá trình được làm lại bằng cách sử dụng đối tượng mới.

  • Khi một toán tử tại chỗ (như `

    >>> name + str(x)
    'Trey2'
    
    7 ') được sử dụng, nếu toán hạng bên trái thực hiện __iop __ (), nó sẽ được gọi mà không có bất kỳ sự ép buộc nào. Khi hoạt động rơi trở lại __op __ () và/hoặc __rop __ (), các quy tắc cưỡng chế thông thường được áp dụng.

  • Trong X

    >>> x.__add__(y)
    NotImplemented
    
    5Y, nếu X là một chuỗi thực hiện nối trình tự, việc ghép trình tự được gọi.

  • Trong X

    >>> name + str(x)
    'Trey2'
    
    9Y, nếu một toán tử là một chuỗi thực hiện sự lặp lại trình tự và cái còn lại là một số nguyên (int hoặc dài), sự lặp lại trình tự được gọi.

  • So sánh phong phú (được thực hiện bởi các phương thức __eq __ (), v.v.) không bao giờ sử dụng sự ép buộc. So sánh ba chiều (được thực hiện bởi __CMP __ ()) sử dụng sự ép buộc trong cùng điều kiện như các hoạt động nhị phân khác sử dụng nó.

  • Trong triển khai hiện tại, các loại số tích hợp int, dài và float không sử dụng sự ép buộc; Tuy nhiên, loại phức tạp sử dụng nó. Sự khác biệt có thể trở nên rõ ràng khi phân lớp các loại này. Theo thời gian, phức hợp loại có thể được cố định để tránh ép buộc. Tất cả các loại này thực hiện một phương thức __Coerce __ (), để sử dụng chức năng ép buộc () tích hợp.

  • Sự ép buộc trong Python với ví dụ là gì?

    Trong lập trình máy tính, sự gắn kết đề cập đến mức độ mà các yếu tố của một mô -đun thuộc về nhau.Do đó, sự gắn kết đo lường sức mạnh của mối quan hệ giữa các phần chức năng trong một mô -đun nhất định.Ví dụ, trong chức năng hệ thống gắn kết cao có liên quan mạnh mẽ.the degree to which the elements of a module belong together. Thus, cohesion measures the strength of relationship between pieces of functionality within a given module. For example, in highly cohesive systems functionality is strongly related.

    Có loại ép buộc loại trong Python?

    Nhiều ngôn ngữ lập trình có một thứ gọi là ép buộc loại;Đó là nơi ngôn ngữ sẽ ngầm chuyển đổi một đối tượng sang loại đối tượng khác trong một số trường hợp nhất định.Python không có sự ép buộc loại.Python does not have type coercion.

    Python ép buộc là gì?

    Loại cưỡng chế là chuyển đổi tự động hoặc ẩn các giá trị từ loại dữ liệu này sang loại dữ liệu khác (chẳng hạn như chuỗi thành số).the automatic or implicit conversion of values from one data type to another (such as strings to numbers).