2017-02-23 4 views
0

Мне было интересно, есть ли передовая практика или соглашение для такого «прикованного» именованного параметра. Я пытаюсь передать первую переменную d в bar через foo. Это неловко делать это таким образом, и я считаю, что должен быть более умный способ, но после того, как мы просмотрели тонны документов, до сих пор не знаем.Именованный параметр, проходящий несколько раз

def bar(a=0, b=0, c=0, d=0): 
    print(a,b,c,d) 

def foo(b=0,d=0): 
    bar(d=d) 

foo(d=1) 
#(0,0,0,1) 
+2

В 'foo' вы вызываете' test() '. Предполагается, что это 'bar()'? – MakPo

+1

также почему у дозы 'foo' есть параметр' b', если он не используется? – MakPo

+0

Извините, опечатка ... исправлена. –

ответ

0

Я не думаю, что есть лучший способ сделать это, но если параметр b не будет использоваться в foo() то я бы не иметь его там.

def bar(a=0, b=0, c=0, d=0): 
    print(a,b,c,d) 

def foo(d=0): 
    bar(d=d) 

foo(1) 
#(0,0,0,1) 
0

Любой ответ здесь субъективен, но я не собираюсь подчиняться, чтобы закрыть вопрос, потому что я думаю, что это ценно для любого, кто изучает Python и профессиональную практику.

С учетом сказанного, я думаю, что путь у вас есть правильно, если b в foo предполагается использовать в строке кода внутри функции после bar называется. Если b не используется, вы должны удалить его из списка параметров.

Но позвольте мне сделать еще один случай, пока мы находимся в субъективности: задайте аргументы при вызове функции с использованием аргументов ключевых слов как можно больше.

Почему?

Потому что, когда вы смотрите на сложный код в профессиональной среде, становится намного понятнее, что передается в функцию и почему. И в Python явно предпочтительнее неявного.

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

Возьмем для примера ниже кода (который является финансовой модели):

def black_scholes(spot, strike, volatility, risk_free_rate, expiry=.25): 
    # do calculation and return result 
    # .... 
    return result 

option_value = black_scholes(44, 48, .08, .54, .75) 

Положите руку на список параметров в определении функции. Можете ли вы сказать, что представляет собой каждый из этих чисел? Несомненно, вы можете найти определение в том же файле и сравнить позиционные аргументы, но что, если black_scholes() находится в другом модуле? Теперь это немного сложнее. Что, если мы расширили это и добавили более высокоуровневую обертку вокруг black_scholes() и , это, что мы должны были отлаживать, чтобы добраться до этого?

Теперь, позвольте мне показать вам вызов функции с аргументами ключевого слова:

result = black_scholes(spot=44, strike=48, volatility=.08, risk_free_rate=.54, expiry=.75) 

Теперь это становится гораздо более ясным, и мы можем ожидать, что ожидаемый результат должен быть. Мы также просто сэкономили много времени на чтении кода и получили результат для сравнения с (учитывая ожидаемый) переход от функции в отладчике вместо того, чтобы идти в нее и читать ее по строкам.

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