pythonenumsenumerationtype-hinting

How to limit the permitted values that can be passed to a method parameter (Using Type Hinting to allow Static Code Analysis)


In Python 3, I want to limit the permitted values that are passed to this method:

my_request(protocol_type, url)

Using type hinting I can write:

my_request(protocol_type: str, url: str)

so the protocol and url are limited to strings, but how can I validate that protocol_type accepts only limited set of values, e.g. 'http' and 'https'?


Solution

  • One way is to write code in the method to validate that the value passed in is 'http' or 'https', something in the lines of:

    if (protocol_type == 'http') or (protocol_type == 'https'):
      Do Something
    else:
      Throw an exception
    

    Which will work fine during runtime, but doesn't provide an indication of a problem while writing the code.

    This is why I prefer using Enum and the type-hinting mechanism that Pycharm and mypy implement.

    For the code example below you will get a warning in Pycharm from its code-inspection, see attached screenshot. The screenshot shows that if you enter a value that is not enum you will get the "Expected Type:..." warning.

    Code:

    """Test of ENUM"""
    
    from enum import Enum
    
    
    class ProtocolEnum(Enum):
        """
        ENUM to hold the allowed values for protocol
        """
        HTTP: str = 'http'
        HTTPS: str = 'https'
    
    
    def try_protocol_enum(protocol: ProtocolEnum) -> None:
        """
        Test of ProtocolEnum
        :rtype: None
        :param protocol: a ProtocolEnum value allows for HTTP or HTTPS only
        :return:
        """
        print(type(protocol))
        print(protocol.value)
        print(protocol.name)
    
    
    try_protocol_enum(ProtocolEnum.HTTP)
    
    try_protocol_enum('https')
    

    Output:

    <enum 'ProtocolEnum'>
    http
    HTTP
    

    Warnings issued by Pycharm Static Code Analysis - Code Inspection