Hướng dẫn how do you restrict data type in python? - làm thế nào để bạn hạn chế kiểu dữ liệu trong python?

I need to accept a number from the user and print the sum. I want the object defined to accept the characters entered by the user to be of integer type only.

I do not want to check the type of the object after the value is entered. I would like a method by which the program doesn't even accept strings or other data types, only integers.

asked May 27, 2019 at 6:55

Hướng dẫn how do you restrict data type in python? - làm thế nào để bạn hạn chế kiểu dữ liệu trong python?

5

I'm quite sure you'd be fine with

def __setattr__(self,name,value):
    def setting_atr(name,value):
        if isinstance(value,(float,int)):
            if name=='radius' and value<0:
                raise ValueError("Attribute 'radius' should be no negative")
            self.__dict__[name]=value
        else:
            raise TypeError("Attribute should be numerical")
    if len(self.__dict__)<3: #number of object attribute
        return setting_atr(name,value)
    elif name not in self.__dict__:
        raise AttributeError("'Circle' object has no such attribute")
    else:
        return setting_atr(name,value)
0/
def __setattr__(self,name,value):
    def setting_atr(name,value):
        if isinstance(value,(float,int)):
            if name=='radius' and value<0:
                raise ValueError("Attribute 'radius' should be no negative")
            self.__dict__[name]=value
        else:
            raise TypeError("Attribute should be numerical")
    if len(self.__dict__)<3: #number of object attribute
        return setting_atr(name,value)
    elif name not in self.__dict__:
        raise AttributeError("'Circle' object has no such attribute")
    else:
        return setting_atr(name,value)
1 and converting the user's input to an
def __setattr__(self,name,value):
    def setting_atr(name,value):
        if isinstance(value,(float,int)):
            if name=='radius' and value<0:
                raise ValueError("Attribute 'radius' should be no negative")
            self.__dict__[name]=value
        else:
            raise TypeError("Attribute should be numerical")
    if len(self.__dict__)<3: #number of object attribute
        return setting_atr(name,value)
    elif name not in self.__dict__:
        raise AttributeError("'Circle' object has no such attribute")
    else:
        return setting_atr(name,value)
2:

# Repeat until a "break" is issued
while True:

    number = input('Enter number: ')

    # Attempt to convert the input to an integer
    try:
        number = int(number)

    # If there was an error converting...
    except ValueError:
        print("That's not a number! Try again.")

    # Break the loop if no error, i.e. conversion was successful
    else:
        break

answered May 27, 2019 at 6:58

Hướng dẫn how do you restrict data type in python? - làm thế nào để bạn hạn chế kiểu dữ liệu trong python?

Markus MeskanenMarkus Meskanen

18.4k16 gold badges74 silver badges116 bronze badges

1

Tôi đã học Python từ không lâu rồi. Nhưng gần như lúc đầu, tôi tình cờ thấy câu hỏi đơn giản: Cách đặt ra một hạn chế (giới hạn) về giá trị đối tượng hoặc thuộc tính của đối tượng mà không cần đưa ra một mô tả lớp khó. Không có vấn đề gì với đánh máy không nghiêm ngặt của Python. Tôi tìm kiếm các phương pháp để kiểm soát không chỉ các loại biến, mà cả các diapason giá trị biến cũng vậy. Ví dụ, hãy để tạo lớp giáo dục cổ điển - "Circle". Một vòng tròn - đối tượng nên có ba thuộc tính: hai tọa độ gốc (một số x, y) và bán kính, trong đó (trong thế giới nhìn thấy con người của chúng ta) x và y nên là số thực, bán kính phải là số dương thực. Tôi bằng cách nào đó đã giải quyết nhiệm vụ này, phương pháp chính xác của lớp "vòng tròn" bên dưới:

def __setattr__(self,name,value):
    def setting_atr(name,value):
        if isinstance(value,(float,int)):
            if name=='radius' and value<0:
                raise ValueError("Attribute 'radius' should be no negative")
            self.__dict__[name]=value
        else:
            raise TypeError("Attribute should be numerical")
    if len(self.__dict__)<3: #number of object attribute
        return setting_atr(name,value)
    elif name not in self.__dict__:
        raise AttributeError("'Circle' object has no such attribute")
    else:
        return setting_atr(name,value)

Tuy nhiên, tôi hoàn toàn không hài lòng với cách tôi đã làm điều đó. Mã này rất lớn cho việc thụ thai rất nhỏ và hầu như không có thể tái sử dụng (tôi biết về các mô tả - nó sẽ cho kết quả gần như tương tự). Tôi sẽ thích một số stile khai báo. Khi tôi đã bắt đầu tìm kiếm một giải pháp thay thế, suy nghĩ đầu tiên của tôi là thêm nhà điều hành của riêng tôi. Nhưng sau khi googling khó khăn, tôi nhận ra rằng không thể tạo ra điều đó trong chính Python (nếu tôi vẫn sai - xin vui lòng tương đương với tôi). Chẳng hạn như tôi chỉ có Newbie, và tham gia nhóm các nhà phát triển Python hoặc Forked Python (:)) không phải là cách nào cho tôi, tôi đã từ bỏ những suy nghĩ này. Một con đường khác có thể trong Stile khai báo là viết một cái gì đó như:

radius=radius if isinstance(radius,(float,int)) else raise TypeError("Attribute should be numerical")
radius=radius if radius>=0 else raise ValueError("Attribute 'radius' should be no negative")

Tất nhiên nó không hoạt động, bởi vì chúng tôi không có khả năng sử dụng 'nâng cao' đó. Tôi có thể gọi các lỗi đối tượng là chức năng để mang nó cho thực tế. Cách đơn giản nhất để làm điều đó đã viết chức năng gây ra lỗi như thế này:

def SomeError(exception=Exception, message="Something don't well"):
if isinstance(exception.args,tuple):
    raise exception
else:
    raise exception(message)

Vì vậy, nó cho phép viết:

radius=radius if radius>=0 else SomeError(ValueError("Attribute 'radius' should be no negative"))

Tôi cũng nghĩ về hình thức theo sau:

@dfValueError(['isinstance(radius,(float,int))'],"Attribute should be numerical")
@dfTypeError(['radius>=0'],"Attribute 'radius' should be no negative")
def fun_radius(x)
    return x

Vấn đề nhỏ với phương pháp này là trong bản in lỗi ra ngoài phức tạp hơn và ít thông tin hơn. Lần đầu tiên, thông báo lỗi dẫn đến chức năng tăng lỗi giả, nơi "oops" thực sự chỉ xảy ra trong các dòng thứ hai.

Mục tiêu của tôi là làm cho khả năng nâng cao ngoại lệ từ các hàm Lambda và các dòng mã như đã hiển thị ở trên, để làm cho mã rõ ràng hơn. Để làm điều này, tôi nên tạo lớp ngoại lệ của riêng mình với phương thức cuộc gọi được triển khai. Vấn đề: Lớp kế thừa không nhìn thấy chính nó trong tên riêng, vì vậy phương thức

__call__(self):
    raise self #yes ha-ha

Cho kết quả:

TypeError: __call__() missing 1 required positional argument: 'self'

Vì vậy, câu hỏi của tôi rất đơn giản: Có thể làm cho đối tượng lỗi có thể gọi được không? Nếu có, những gì tôi nên đọc, để làm điều đó. Và ngoài ra, nếu ai đó giải quyết vấn đề nhỏ này, tôi sẽ rất vui. P.S. Tôi biết các mẫu (về khai báo biến bán kính) cho thấy ở trên không thể được thực hiện trong lớp "vòng tròn" này. Tôi chỉ cho nó làm ví dụ để thể hiện theo dõi suy nghĩ của tôi. Xin vui lòng, đừng chọn nó.

Lời bạt (của Marat) Cảm ơn rất nhiều người đã viết và bỏ phiếu trong chủ đề này. Sau khi đọc được câu trả lời, tôi đã nghĩ rất lâu và Finaly đã tự nâng mình lên để thêm một số gia tăng cho chủ đề này (ngay cả khi nó gây ra một số rủi ro cho các quy tắc xâm phạm). Cho lần đầu tiên. Một số người đã viết rằng chúng tôi không cần quan tâm đến các lỗi ở trạng thái tạo đối tượng và thậm chí không cần phải kiểm soát các loại biến (vì nó không được thực hiện trong Python theo mặc định). Mặc dù tôi đã không có thời gian dài trong lập trình định hướng đối tượng, nhưng trước đó tôi đã (và vẫn có) làm việc trên tính toán một quy trình và thiết bị kỹ thuật. Vì vậy, tôi rất tự tin về những từ này: "Lỗi có thể nên được định vị càng sớm càng tốt (tôi không nói được cải thiện)". Nhiều thuật toán để tính toán một quá trình vật lý thực sử sử dụng các lần lặp và đệ quy, vì vậy nếu bạn trượt ra (đối với xử lý sau này), một số sai lầm đã xảy ra, nó có thể mang lại lỗi khó phát hiện trong kết quả cuối cùng. Vì vậy, có Python, từ quan điểm này. "Gõ vịt" của Python là tuyệt vời để tạo mẫu nhanh và đơn giản hóa lập trình ứng dụng. Nhưng "đánh máy vịt" không phải là một nhu cầu tôn giáo. Tuy nhiên, kiểu chữ không đáng kể của Python, đó không phải là một điều kỳ lạ khi thêm một kiểm soát loại, nếu bạn nghĩ rằng bạn cần điều đó. Nhưng phong cách Python áp đặt để thực hiện nó khác với phong cách trong các ngôn ngữ đánh máy tĩnh như C ++, Java và v.v. Trong Python, chúng ta chỉ có thể kiểm soát đối tượng trong một số "điểm kiểm soát". Điều này hướng dẫn chúng tôi đến các nguyên tắc "lập trình theo định hướng hệ thống" (Therm là của tôi, nhưng tôi không kiểm tra xem nó có tồn tại trên báo chí hay không, vì vậy nó có thể có ý nghĩa khác với cùng một tác giả khác và ý tôi cũng có thể có tên khác ). Chúng ta nên (nếu sẽ) đặt "các điểm điều khiển" ở đầu vào và đầu ra của các phần tử của hệ thống (chính). Những gì là cho các yếu tố hệ thống? Nó phải là bất kỳ đối tượng nào có không gian tên riêng và có thể tương tác với chức năng bên ngoài (theo các phương thức cũng). Phiên bản đơn giản nhất của đầu vào điều khiển phần tử chức năng là: Thank very much who wrote and voted in this topic. After readed answers, I thought very long, and finaly raised myself to add some augment to this topic (even if it entail some risk to infringe rules). For the first. Some people have wrote that we dont't need care about errors at the object creation state, and even no need to control variable types at all (inasmuch as it no has implemented in python by default). Although I have been no long time in object oriented programming, before that I had (and still have) been work on calculation a technical processes and devices. So I'm very confident about this words: "Possible error should be localized as soon as possible (I didn't say improved)". Many algorithms for calculation a real physical processes use iterations and recursions so if you slip out (for later handle) some occurred mistake it could brought a hard detectable error in final result. So, there is python, from this point of view. Python's "Duck Typing" is great for quick prototyping and simplifying applied programming. But "Duck Typing" is not a religion demand. Nevertheless Python's unstrict typification it isn't a bizarre thing to add a type control, if you think you need that. But the style which Python impose to perform it differ from the style in the static typification languages as C++, Java and etc. In Python we can control the object only in some "control points". This guide us to the "System Oriented Programming" principles (Therm is mine, but I didn't check if it exist in press, so it may has differ meaning from the same of another authors, and what I mean may also has another name). We should (if will) set the "control points" at the inlet and outlet of the elements of (main) system. What is for the system elements? It should be any object who has own name space and can interact with outside as function (by methods also). The simplest version of inlet controlling for function element is:

def func(a,b,c):
    #just like this
    a=int(a)
    b=str(b)
    c=list(c)

Sự kết hợp và cách tiếp cận thú vị hơn được hiển thị ở đây: Người trang trí kiểm tra loại cho Python 2

Một cách riêng biệt, về phương pháp được đề xuất bởi đồng tác giả của tôi. Trình trang trí "Thuộc tính" sử dụng các phương thức giống như mô tả, vì vậy nó mô phỏng các thuộc tính đối tượng theo các phương thức lớp. Chế độ này nên được sử dụng cẩn thận vì trong Python, các đối tượng của cùng một lớp được chia sẻ không gian tên lớp. Tôi để bản thân viết lại cùng một chương trình đã viết bởi @izkata với

def __setattr__(self,name,value):
    def setting_atr(name,value):
        if isinstance(value,(float,int)):
            if name=='radius' and value<0:
                raise ValueError("Attribute 'radius' should be no negative")
            self.__dict__[name]=value
        else:
            raise TypeError("Attribute should be numerical")
    if len(self.__dict__)<3: #number of object attribute
        return setting_atr(name,value)
    elif name not in self.__dict__:
        raise AttributeError("'Circle' object has no such attribute")
    else:
        return setting_atr(name,value)
3 (một lần nữa):object attributes by class methods. This mode should be used carefully because in python the objects of same class are shared the class name space. I let myself rewrote the same programm that have wrote by @Izkata with
def __setattr__(self,name,value):
    def setting_atr(name,value):
        if isinstance(value,(float,int)):
            if name=='radius' and value<0:
                raise ValueError("Attribute 'radius' should be no negative")
            self.__dict__[name]=value
        else:
            raise TypeError("Attribute should be numerical")
    if len(self.__dict__)<3: #number of object attribute
        return setting_atr(name,value)
    elif name not in self.__dict__:
        raise AttributeError("'Circle' object has no such attribute")
    else:
        return setting_atr(name,value)
3 (again):

filter_function_for_radius=lambda value: value if value>0 else SomeError(ValueError, 'Radius cannot be negative')
class Circle(object):
    def __init__(self, x=0, y=0, radius=1):
        self.x = x
        self.y = y
        self.radius =radius
    def __setattr__(self,name,value):
        if name=='radius':
            value=filter_function_for_radius(value)
        self.__dict__[name]=value

... Và nếu bạn cần một số bán kính khác (có lẽ phức tạp hoặc tiêu cực) cho một số vòng tròn hipothetical, bạn không cần phải thừa hưởng hoặc xác định lại lớp, chỉ là "thay đổi bộ lọc". Nhưng lợi thế đó của kiểu chức năng chỉ có thể có được bằng cách sử dụng

def __setattr__(self,name,value):
    def setting_atr(name,value):
        if isinstance(value,(float,int)):
            if name=='radius' and value<0:
                raise ValueError("Attribute 'radius' should be no negative")
            self.__dict__[name]=value
        else:
            raise TypeError("Attribute should be numerical")
    if len(self.__dict__)<3: #number of object attribute
        return setting_atr(name,value)
    elif name not in self.__dict__:
        raise AttributeError("'Circle' object has no such attribute")
    else:
        return setting_atr(name,value)
3 hoặc bằng cách tạo Metaclass của riêng. Và một lần nữa cảm ơn bạn, vì đã trả lời.

Làm thế nào để bạn hạn chế đầu vào trong Python?

Để giới hạn đầu vào của người dùng vào một phạm vi: Sử dụng vòng lặp trong thời gian để lặp lại cho đến khi giá trị đầu vào được cung cấp nằm trong phạm vi. Trên mỗi lần lặp, kiểm tra xem giá trị có nằm trong phạm vi được chỉ định không. Nếu điều kiện được đáp ứng, hãy sử dụng một câu lệnh ngắt để thoát ra khỏi vòng lặp.Use a while loop to iterate until the provided input value is in range. On each iteration, check if the value is in the specified range. If the condition is met, use a break statement to break out of the loop.

Làm cách nào để hạn chế đầu vào cho số nguyên trong Python?

Như chúng ta biết rằng hàm đầu vào tích hợp () của Python luôn trả về đối tượng lớp STR (Chuỗi). Vì vậy, để lấy đầu vào số nguyên, chúng ta phải gõ các đầu vào đó vào số nguyên bằng cách sử dụng hàm int int () tích hợp python.type cast those inputs into integers by using Python built-in int() function.

Bạn có thể chỉ định kiểu dữ liệu trong Python không?

Python là một ngôn ngữ được gõ động, có nghĩa là chúng ta không phải chỉ định các loại dữ liệu khi chúng ta tạo các biến và hàm.Mặc dù điều này làm giảm lượng mã chúng ta cần viết, khối lượng công việc mà chúng ta lưu lần lượt được thêm vào nhà phát triển tiếp theo cần hiểu và gỡ lỗi chức năng hiện có!we don't have to specify data types when we create variables and functions. While this reduces the amount of code we need to write, the workload that we save is in turn added to the next developer that needs to understand and debug the existing function!

Làm thế nào để bạn chỉ định các loại dữ liệu trong các hàm Python?

Python là một ngôn ngữ động được gõ mạnh, trong đó chúng ta không phải chỉ định loại dữ liệu của đối số chức năng trả về chức năng.Nó liên quan loại với các giá trị thay vì tên.Cách duy nhất để chỉ định dữ liệu của các loại cụ thể là cung cấp các kiểu dữ liệu rõ ràng trong khi gọi các chức năng.providing explicit datatypes while calling the functions.