Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Нужны советы по использованию имен аргументов функций, которые описаны во внешнем окружении

#python


Проблема следующая, и думаю известная многим. При использовании в именах аргументов
функций переменных с названиями, которые использовались во внешнем окружении IDE выводим
соответствующее предупреждение - Shadow name "proxy" from outer scope. И правильно
делает, так как это может привести к ошибкам(обсуждается вот тут)

proxy = 'somepr.ox'

def func(proxy):
    # do somethings
    return proxy


Ни использовать решение которое вытекает из PEP8(синонимы или proxy_ ) мне не очень
нравится так все равно иногда можно допустить ошибку, да и код выглядит убого(имхо):

def func(proxy_, server_, user_):
    ...
    return proxy_

Один знакомый(Megabit, привет) дал совет который я использовал в C++ - в начале каждого
аргумента ставится буква А(Аргумент), но в Python используется другой стиль и такой
"финт" наверное испортит читабельность кода.

int BrootSearch(byte* Abuff, int ALength)
{
    int result = -1;
}


Прошу совет у людей кто работает в команде или много работал с чужим кодом и знает
хороший метод именования аргументов которых удобен для чтения кода.
Спасибо за внимание. Вариант описанный ниже, предлагаю не рассматривать:

def func(proxy):
    return proxy

def main():
    proxy = 'somepr.ox'

main()

    


Ответы

Ответ 1



Можно параметры функции спрятать за **, но мне это видится диким костылем: def func(**kwargs): return kwargs['proxy'], kwargs['name'] proxy = 'somepr.ox' if __name__ == '__main__': print(func(proxy='www.ru', name='abc')) PS. Можно, конечно, сократить название параметра до _, но это уже костыль для костыля: def func(**_): return _['proxy'], _['name']

Ответ 2



Вот такой псевдокод от бизнес-консультанта )) if вы_работаете_в_команде : if ответ_отсутствует_в_задокументированных_внутренних_соглашениях_по_стилю_кода обсудите этот пункт в команде добавьте нужный пункт во внутренние соглашения поступайте по внутренним соглашениям else: используйте PEP8 (т.е. пишите: proxy_ ) Тогда другие вас поймут при чтении вашего кода. Если пишете только для себя и не планируете работать в команде - то какая разница.

Ответ 3



То что вам по-советовали на мой взгляд ничем не отличается от нижнего подчёркивания: Aurl и url_. Я бы вам посоветовал перевести все входные параметры в словари или объекты со значением словарь или кортеж. Тогда бы у вас аргументы назывались текстом на входе и как переменная в функциях, ну и распаковка облегчит жизнь: my_args = {"x" : 10} def f(x): return x*2 print f(**my_args)

Комментариев нет:

Отправить комментарий