Существует ли карта без результата в Python?

Я хотел бы поделиться другим решением, работающим с UI-маршрутизатором 1.0.0.X.

Как вы, возможно, знаете, stateChangeStart и stateChangeSuccess теперь устарели. https://github.com/angular-ui/ui-router/issues/2655

Вместо этого вы должны использовать $ transitions http: //angular-ui.github. io / ui-router / 1.0.0-alpha.1 / interfaces / transition.ihookregistry.html

Вот как я этого добился:

Сначала у меня и AuthService с некоторыми полезными функциями

angular.module('myApp')

        .factory('AuthService',
                ['$http', '$cookies', '$rootScope',
                    function ($http, $cookies, $rootScope) {
                        var service = {};

                        // Authenticates throug a rest service
                        service.authenticate = function (username, password, callback) {

                            $http.post('api/login', {username: username, password: password})
                                    .success(function (response) {
                                        callback(response);
                                    });
                        };

                        // Creates a cookie and set the Authorization header
                        service.setCredentials = function (response) {
                            $rootScope.globals = response.token;

                            $http.defaults.headers.common['Authorization'] = 'Bearer ' + response.token;
                            $cookies.put('globals', $rootScope.globals);
                        };

                        // Checks if it's authenticated
                        service.isAuthenticated = function() {
                            return !($cookies.get('globals') === undefined);
                        };

                        // Clear credentials when logout
                        service.clearCredentials = function () {
                            $rootScope.globals = undefined;
                            $cookies.remove('globals');
                            $http.defaults.headers.common.Authorization = 'Bearer ';
                        };

                        return service;
                    }]);

Тогда у меня есть эта конфигурация:

angular.module('myApp', [
    'ui.router',
    'ngCookies'
])
        .config(['$stateProvider', '$urlRouterProvider',
            function ($stateProvider, $urlRouterProvider) {
                $urlRouterProvider.otherwise('/resumen');
                $stateProvider
                        .state("dashboard", {
                            url: "/dashboard",
                            templateUrl: "partials/dashboard.html",
                            controller: "dashCtrl",
                            data: {
                                authRequired: true
                            }
                        })
                        .state("login", {
                            url: "/login",
                            templateUrl: "partials/login.html",
                            controller: "loginController"
                        })
            }])

        .run(['$rootScope', '$transitions', '$state', '$cookies', '$http', 'AuthService',
            function ($rootScope, $transitions, $state, $cookies, $http, AuthService) {

                // keep user logged in after page refresh
                $rootScope.globals = $cookies.get('globals') || {};
                $http.defaults.headers.common['Authorization'] = 'Bearer ' + $rootScope.globals;

                $transitions.onStart({
                    to: function (state) {
                        return state.data != null && state.data.authRequired === true;
                    }
                }, function () {
                    if (!AuthService.isAuthenticated()) {
                        return $state.target("login");
                    }
                });
            }]);

Вы можете видеть, что я использую

data: {
   authRequired: true
}

, чтобы отметить состояние доступно только если аутентифицирован.

затем, на .run я использую переходы для проверки состояния с аутентификацией

$transitions.onStart({
    to: function (state) {
        return state.data != null && state.data.authRequired === true;
    }
}, function () {
    if (!AuthService.isAuthenticated()) {
        return $state.target("login");
    }
});

Я строю этот пример, используя некоторый код, найденный в документации $ переходов. Я довольно новый пользовательский интерфейс роутера, но он работает.

Надеюсь, что это может кому-нибудь помочь.

27
задан Juergen 3 July 2009 в 16:20
поделиться

9 ответов

Как насчет этого?

for x in wowList:
    installWow(x, 'installed by me')
del x
13
ответ дан 28 November 2019 в 04:32
поделиться

Вы могли создайте свою собственную функцию "each":


def each(fn, items):
    for item in items:
        fn(item)


# called thus
each(lambda x: installWow(x, 'installed by me'), wowList)

В основном это просто карта, но без возврата результатов. Используя функцию, вы убедитесь, что переменная "item" не попадает в текущую область видимости.

26
ответ дан 28 November 2019 в 04:32
поделиться

Каждое выражение оценивает что-то, поэтому вы всегда получаете результат, каким бы способом вы это ни делали. И любой такой возвращенный объект (как и ваш список) будет впоследствии отброшен, потому что на него больше нет ссылки.

Для пояснения: очень немногие вещи в python являются операторами, которые ничего не возвращают. Даже такой вызов функции, как

doSomething()

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

7
ответ дан 28 November 2019 в 04:32
поделиться

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

#!/usr/bin/env python
y = 0
def myfunction(x):
  global y
  y += x

input = (1, 2, 3, 4)

print "Filter output: %s" % repr(filter(myfunction, input))
print "Side effect result: %d" % y

Запуск дает следующий результат:

Filter output: ()
Side effect result: 10
3
ответ дан 28 November 2019 в 04:32
поделиться

Вы можете попробовать следующее:

filter(lambda x: installWow(x, 'installed by me') and False, wowList)

Таким образом, результатом будет пустой список, несмотря ни на что.

Или вы можете просто отбросить и False , если вы можете заставить installWow () всегда возвращать False (или 0, или None или другое выражение, которое оценивает false).

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

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

reduce(lambda x,y: x(y, 'installed by me') , wowList, installWow)

только поворот - это установкаWow должен вернуть себя, например,

def installWow(*args):
    print args
    return installWow
3
ответ дан 28 November 2019 в 04:32
поделиться

, если можно нарушить работу wowList

while wowList: installWow(wowList.pop(), 'installed by me')

, если вы действительно хотите поддерживать wowList

wowListR = wowList[:]
while wowListR: installWow(wowListR.pop(), 'installed by me')

] и если порядок имеет значение

wowListR = wowList[:]; wowListR.reverse()
while wowListR: installWow(wowListR.pop(), 'installed by me')

Хотя как решение загадки мне нравится первое :)

3
ответ дан 28 November 2019 в 04:32
поделиться

сначала перепишите цикл for как выражение генератора, которое не выделяет никакой памяти.

(installWow(x,  'installed by me') for x in wowList )

Но это выражение на самом деле ничего не делает, если не находит способа его использовать. Таким образом, мы можем переписать это, чтобы получить что-то определенное, вместо того, чтобы полагаться на возможный результат None installWow .

( [1, installWow(x,  'installed by me')][0] for x in wowList )

, который создает список, но возвращает только константу 1. Это можно удобно использовать с помощью reduce

reduce(sum, ( [1, installWow(x,  'installed by me')][0] for x in wowList ))

, который удобно возвращает количество затронутых элементов в wowList.

1
ответ дан 28 November 2019 в 04:32
поделиться

Просто сделайте installWow return None или передайте последний оператор следующим образом:


def installWow(item, phrase='installed by me'):
  print phrase
  pass

и используйте это:


list(x for x in wowList if installWow(x))

x не будет установлен в глобальном пространстве имен и будет возвращен список [] синглтон

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

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