2012-04-22 2 views
7

У меня есть функция, которая рассчитывает работать с числовым типом. Я читаю числа для работы из файла, поэтому, когда я их читаю, это строки, а не числовые. Лучше ли моя функция терпимо относиться к другим типам (вариант (A) ниже) или преобразовать в числовое значение перед вызовом функции (вариант (B) ниже)?Python convert style: внутри или вне функции?

# Option (A) 
def numeric_operation(arg): 
    i = int(arg) 
    # do something numeric with i 

# Option (B) 
def numeric_operation(arg): 
    # expect caller to call numeric_operation(int(arg)) 
    # do something numeric with arg 

ответ

6

Если функция рассчитывает работать на числовых данных, то вы, вероятно, лучше с позволяя Python бросить TypeError, если он не получает один и что-то пойдет не так. Я бы сказал, сделайте преобразование снаружи и обработайте исключение.

def numeric_operation(arg): 
    # Do numeric things 

try: 
    numeric_operation("abc") 
except TypeError: 
    print("That was supposed to be numeric.") 
1

Это зависит от вашего варианта использования. Ваше имя функции предполагает, что это строго математическая операция, и в этом случае, вероятно, не имеет смысла принимать строки. Это принципиально вопрос о separation of concerns; если ваша функция делает математику, она не должна также do преобразование. Поэтому в этом случае я бы посоветовал сначала преобразовать и передать только числовые типы функции.

Но если бы это была функция, которая выполняла много операций ввода-вывода, может быть вполне разумно - даже предпочтительнее - вызвать int на все, что было передано. Если ваша функция делает какой-то странный набор преобразований ваших данных, чтобы сделать их презентабельными для конечного пользователя или для преобразования пользовательского ввода, эти преобразования должны быть инкапсулированы и сгруппированы вместе как можно больше, так что работа, которую они выполняют, не «истекает» на другие функции.

5

Я бы разделил эти операции. Имейте одну функцию для чтения чисел из файла, и пусть эта функция возвращает реальные числа или массивы. Функции, выполняющие числовые операции, не должны иметь дело с преобразованиями каждый раз, когда вы их вызываете, и вам не нужно выполнять его для каждой функции. Могут быть исключения, такие как числовая функция, принимающая числа, списки чисел и массивы.

Когда вы ставите все вместе, вы не увидите никаких строк. Почему ты должен? В указанном файле нет реальных строк. Это числа, закодированные как строки, поэтому просто прочитайте их соответственно и скройте преобразование в функции, которая импортирует данные из вашего файла.

1

Не делайте ничего.

У Python уже есть отличный механизм обработки ошибок, который будет бросаться, если вы попытаетесь сделать что-то числовое со строкой, и все, что вы сделаете, просто скроет ошибку, которую вы ожидаете получить.

>>> def foo(i): 
...  return i+1 
... 
>>> foo(3) 
4 
>>> foo("hello") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in foo 
TypeError: Can't convert 'int' object to str implicitly 
+0

Я не понимаю, что вы пытаетесь сказать. «все, что вы делаете, просто скроет ошибку». В вашем примере ничего не скрывает тот факт, что foo не может обрабатывать строки. Если я вызываю foo («hello»), python throws «не может преобразовать int в str». Хью? Я не дал тебе инт? Что, черт возьми, неправильно с этой функцией? Я бы сказал, что ошибка теперь максимально скрыта :) – pwuertz

+0

Я хочу сказать, что ваша функция ожидает числовые данные. Что-то должно пойти не так, когда вы попытаетесь использовать строку вместо этого, что почти наверняка вызовет 'TypeError'. __That__ должна быть ошибкой, которую вы передаете пользователю, - той, что из бит, который _actually поступил неправильно. – katrielalex

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