Раньше я думал, что создание объектов во время выполнения будет лучшим подходом. Теперь я менее уверен, так как вы теряете некоторые полезные функции, хотя это может стоить того, что было бы просто для предотвращения путаницы новичков. Недостатками этого являются:
1. Производительность
def foo(arg=something_expensive_to_compute())):
...
Если используется оценка времени вызова, тогда дорогая функция вызывается каждый раз, когда ваша функция используется без аргумента. Вы либо заплатили бы дорогостоящую цену за каждый вызов, либо должны вручную кэшировать значение извне, загрязняя пространство имен и добавляя многословие.
2. Принудительные связанные параметры
Полезный трюк заключается в привязке параметров лямбда к привязке current переменной при создании лямбда. Например:
funcs = [ lambda i=i: i for i in range(10)]
Возвращает список функций, возвращающих 0,1,2,3 ... соответственно. Если поведение изменено, они вместо этого привяжут i
к значению времени вызова для i, поэтому вы получите список функций, которые все вернули 9
.
Единственным способом реализации этого в противном случае было бы создать дальнейшее закрытие с привязкой i, то есть:
def make_func(i): return lambda: i
funcs = [make_func(i) for i in range(10)]
3. Introspection
Рассмотрим код:
def foo(a='test', b=100, c=[]):
print a,b,c
Мы можем получить информацию о аргументах и значениях по умолчанию с помощью модуля inspect
, который
>>> inspect.getargspec(foo)
(['a', 'b', 'c'], None, None, ('test', 100, []))
информация очень полезна для таких вещей, как создание документов, метапрограммирование, декораторы и т. д.
Теперь предположим, что поведение по умолчанию может быть изменено так, что это эквивалентно:
_undefined = object() # sentinel value
def foo(a=_undefined, b=_undefined, c=_undefined)
if a is _undefined: a='test'
if b is _undefined: b=100
if c is _undefined: c=[]
Однако мы потеряли способность интроспекции и посмотрим, какие аргументы по умолчанию равны . Поскольку объекты не были построены, мы никогда не сможем их захватить, не называя функцию. Самое лучшее, что мы могли бы сделать, это сохранить исходный код и вернуть его как строку.
У нас была ситуация, когда нам нужно было сохранить хэш URL-адресов через обратную связь ASP.Net. Поскольку браузер не отправляет хэш на сервер по умолчанию, единственный способ сделать это - использовать Javascript:
window.location.hash
) и сохраните его в скрытом поле ввода на стороне сервера. Поместите это в DIV с идентификатором «urlhash
», чтобы мы могли легко найти его позже. window.location.hash again
) и / или выполните другие действия. Мы использовали jQuery для упрощения выбор поля и т. д. ... в целом он вызывает несколько вызовов jQuery, один для сохранения значения, а другой - для его восстановления.
Перед подачей:
$("form").submit(function() {
$("input", "#urlhash").val(window.location.hash);
});
При загрузке страницы:
var hashVal = $("input", "#urlhash").val();
if (IsHashValid(hashVal)) {
window.location.hash = hashVal;
}
IsHashValid()
может проверять «undefined
» или другие вещи, которые вы не хотите обрабатывать.
Кроме того, make конечно, вы, конечно, используете $(document).ready()
.
Это потому, что браузер не передает эту часть на сервер, извините.
RFC 2396 раздел 4.1:
Когда ссылка URI используется для выполнения поиска по идентифицированному ресурсу, необязательный идентификатор фрагмента, отделенный от URI посредством символа crosshatch ("#"), состоит из дополнительной справочной информации, которая должна быть интерпретирована пользовательским агентом после успешного завершения поиска. Таким образом, он не является частью URI, но часто используется в сочетании с URI.
blockquote>(выделено мной)
Просто, чтобы исключить возможность того, что вы на самом деле не пытаетесь увидеть фрагмент в GET / POST и на самом деле хотите узнать, как получить доступ к той части объекта URI, которая у вас есть в вашем серверном коде, она находится под Uri.Fragment ( Документы MSDN ).
Вероятно, единственный выбор - прочитать его на стороне клиента и перенести его вручную на сервер (GET / POST / AJAX). С уважением Артур
Вы также можете посмотреть, как играть с кнопкой «Назад» и историей браузера на Malcan
Возможное решение для запросов GET:
Новый формат ссылки: http://example.com/yourDirectory?hash=video01
Вызовите эту функцию к верхней части контроллера или http://example.com/yourDirectory/index.php
:
function redirect()
{
if (!empty($_GET['hash'])) {
/** Sanitize & Validate $_GET['hash']
If valid return string
If invalid: return empty or false
******************************************************/
$validHash = sanitizeAndValidateHashFunction($_GET['hash']);
if (!empty($validHash)) {
$url = './#' . $validHash;
} else {
$url = '/your404page.php';
}
header("Location: $url");
}
}