2015-09-30 2 views
1

Я пытаюсь написать словарь «switch» в python. Я хочу иметь возможность читать данные из текстового файла и делать разные вещи в зависимости от его типа данных. Так, например, если я читаю в строке, я хочу сравнить ее с другой строкой. Или, если я читаю в поплавке, я хочу сделать с ним некоторые операции. Это операция очистки данных для программы машинного обучения.Используйте словарь python для «switch» on datatype

Возможно, я мог бы сделать это с помощью инструкции If ... Else, но поскольку я мог бы иметь что-то для каждого типа данных, я бы предпочел сделать это чище.

Я использую следующий код:

varX = 2.0 
switchDict = {"bool": "boolean", "int": "integer","float": "floatType", 
       "str": "string"} 

switchDict[str(type(varX))]() 

def boolean(): 
    print("You have a boolean") 

def integer(): 
    print("You have an integer") 

def floatType(): 
    print("You have a float") 

def string(): 
    print("You have a string”) 

Она возвращает:

Traceback (most recent call last): 
    File "/Gower71/Switch.py", line 5, in <module> 
switchDict[str(type(varX))]() 
KeyError: "<class ‘float'>" 

Если я изменяю switchDict строки:

switchDict = {bool: "boolean", int: "integer", float: "floatType", str: "string"} 
switchDict[type(varX)]() 

возвращает:

Traceback (most recent call last): 
    File "/Gower71/Switch.py", line 5, in <module> 
    switchDict[type(varX)]() 
TypeError: 'str' object is not callable 

Есть ли способ включить такой тип?

+0

* Я бы предпочел сделать это чище * Я не уверен, что вы пытаетесь сделать, можно назвать более чистым ;-) –

+0

О ... Я просто пытаюсь написать программу, которая строит матрицу несходства для смешанных типов данных. Идея основана на документе Дж. С. Гауэра с 1971 года. И я уверен, что все мои коды на Python могут быть более чистыми ... –

ответ

5

Вы должны сохранить фактические ссылки функций как значения, а не их имена в виде строк. Пример:

def boolean(): 
    print("You have a boolean") 

def integer(): 
    print("You have an integer") 

def floatType(): 
    print("You have a float") 

def string(): 
    print("You have a string") 

switchDict = {bool: boolean, int: integer, float: floatType, str: string} 
switchDict[type(varX)]() 

Для этого вам нужно будет переместить конструкцию словаря после того, как будут определены все функции.

Кроме того, было бы рекомендовано не использовать string как имя функции, оно конфликтует с string, который является стандартным модулем. Было бы лучше использовать другое имя, например string_type.

+0

Вот и все ... Спасибо! –

Смежные вопросы