Я собираюсь принять ответ для Windows.
Таким образом, кажется, работает хорошо.
В установщике сделайте:
1. Создайте сервис ручного запуска, который работает как LocalSystem, который при запуске делает обновление, затем останавливается.
2. Измените сервисные полномочия, таким образом, все пользователи могут запустить сервис (если все пользователи должны смочь обновить w/o права администратора).
3. Измените основную программу для проверки на обновления, запущено с помощью простого механизма. Если это обнаруживает обновление, подсказку, если пользователь хочет применить его.
4. Если пользователь принимает обновление, запустите сервис.
, Если архитектура допускает его, создайте способ контролировать обновление, когда это работает.
Обычно вы делаете это, чтобы сделать замыкания :
def make_adder(x):
def add(y):
return x + y
return add
plus5 = make_adder(5)
print(plus5(12)) # prints 17
Внутренние функции могут обращаться к переменным из включающей области (в данном случае к локальной переменной x
). Если вы не обращаетесь ни к каким переменным из окружающей области видимости, на самом деле это обычные функции с другой областью видимости.
Я не могу представить себе какой-либо веской причины для такого кода.
Возможно, была причина для внутренней функции в более старых версиях, как и в других операциях.
Например, это придает немного больше смысла:
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)
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()
Идея локальных методов аналогична локальным переменным: не загрязнять большее пространство имен. Очевидно, что преимущества ограничены, поскольку большинство языков не предоставляют такие функции напрямую.
Вы уверены, что код был именно таким? Обычная причина делать что-то подобное - создать партиал - функцию с запеченными параметрами. Вызов внешней функции возвращает вызываемый объект, которому не нужны параметры, поэтому его можно сохранить и использовать там, где невозможно передать параметры. Однако опубликованный вами код этого не сделает - он немедленно вызывает функцию и возвращает результат, а не вызываемый объект. Возможно, будет полезно опубликовать код, который вы видели.