Вложенная функция в Python

Я собираюсь принять ответ для Windows.

Таким образом, кажется, работает хорошо.

В установщике сделайте:
1. Создайте сервис ручного запуска, который работает как LocalSystem, который при запуске делает обновление, затем останавливается.
2. Измените сервисные полномочия, таким образом, все пользователи могут запустить сервис (если все пользователи должны смочь обновить w/o права администратора).
3. Измените основную программу для проверки на обновления, запущено с помощью простого механизма. Если это обнаруживает обновление, подсказку, если пользователь хочет применить его.
4. Если пользователь принимает обновление, запустите сервис.

, Если архитектура допускает его, создайте способ контролировать обновление, когда это работает.

78
задан Hosam Aly 17 January 2011 в 09:41
поделиться

5 ответов

Обычно вы делаете это, чтобы сделать замыкания :

def make_adder(x):
    def add(y):
        return x + y
    return add

plus5 = make_adder(5)
print(plus5(12))  # prints 17

Внутренние функции могут обращаться к переменным из включающей области (в данном случае к локальной переменной x ). Если вы не обращаетесь ни к каким переменным из окружающей области видимости, на самом деле это обычные функции с другой областью видимости.

105
ответ дан 24 November 2019 в 10:28
поделиться

Я не могу представить себе какой-либо веской причины для такого кода.

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

Например, это придает немного больше смысла:

class some_class(parent_class):
    def doOp(self, op, x, y):
        def add(x, y):
            return x + y
        def sub(x,y):
            return x - y
        return locals()[op](x,y)

some_class().doOp('add', 1,2)

, но тогда внутренняя функция должна быть («частным») методами класса:

class some_class(object):
    def _add(self, x, y):
        return x + y
    def doOp(self, x, y):
        return self._add(x,y)
8
ответ дан 24 November 2019 в 10:28
поделиться

Aside from function generators, where internal function creation is almost the definition of a function generator, the reason I create nested functions is to improve readability. If I have a tiny function that will only be invoked by the outer function, then I inline the definition so you don't have to skip around to determine what that function is doing. I can always move the inner method outside of the encapsulating method if I find a need to reuse the function at a later date.

Toy example:

import sys

def Foo():
    def e(s):
        sys.stderr.write('ERROR: ')
        sys.stderr.write(s)
        sys.stderr.write('\n')
    e('I regret to inform you')
    e('that a shameful thing has happened.')
    e('Thus, I must issue this desultory message')
    e('across numerous lines.')
Foo()
53
ответ дан 24 November 2019 в 10:28
поделиться

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

6
ответ дан 24 November 2019 в 10:28
поделиться

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

1
ответ дан 24 November 2019 в 10:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: