Для коммерческих инструментов Вы могли бы хотеть попробовать Засыпанный снегом.
Мой опыт с ними несколько датирован, но я нашел их Java API Обработки изображений, чтобы быть намного легче использовать, чем JAI и намного быстрее.
Их поддержка клиентов и примеры кода были очень хороши также.
В общем случае вам нужно написать свою функцию извлечения ключей для сортировки; только в особых (хотя и важных) случаях бывает так, что вы можете просто повторно использовать существующий вызываемый объект для извлечения ключей или просто соединить пару уже существующих («быстрым и грязным» способом с использованием лямбда
, поскольку нет встроенного способа выполнения композиции функций).
Если вам часто требуется выполнять эти два вида операций для извлечения ключа (получить элемент и вызвать метод для этого элемента), я предлагаю:
def combiner(itemkey, methodname, *a, **k):
def keyextractor(container):
item = container[itemkey]
method = getattr(item, methodname)
return method(*a, **k)
return keyextractor
поэтому listofdicts.sort (key = combiner ('name', 'lower'))
будет работать в вашем случае.
Обратите внимание, что, хотя чрезмерное обобщение требует затрат, изящное и умеренное обобщение (оставив ключ элемента , имя метода и аргументы метода, если таковые имеются, в зависимости от времени выполнения,
Как насчет этого:
list_of_dicts.sort(key=lambda a: a['name'].lower())
Вам, вероятно, следует использовать лямбду для удобства чтения. Но как интересное исследование функций высшего порядка, вот расширенная версия q-комбинатора в Python (также известного как комбинатор странных птиц). Это позволяет вам создать новую функцию, составив две функции
def compose(inner_func, *outer_funcs):
if not outer_funcs:
return inner_func
outer_func = compose(*outer_funcs)
return lambda *args, **kwargs: outer_func(inner_func(*args, **kwargs))
from operator import itemgetter, methodcaller
name_lowered = compose(itemgetter('name'), methodcaller('lower'))
print(name_lowered( {'name': 'Foo'} ))
. Если вы поменяете местами определения внутреннего и внешнего в функции compose
, вы получите более традиционный b-комбинатор (bluebird). Мне больше нравится q-комбинатор из-за его сходства с конвейерами unix.
Как насчет использования переключателей wsdl / server
или wsdl / serverinterface
?
Насколько я понимаю свойства командной строки wsdl.exe, это именно то, что вам нужно.
- ADVANCED -
/ server
Server switch has been deprecated. Please use /serverInterface instead.
Generate an abstract class for an xml web service implementation using
ASP.NET based on the contracts. The default is to generate client proxy
classes.
С другой стороны: почему вы хотите создавать устаревшие технологические решения? Почему бы не создать эту веб-службу как службу WCF. Это текущий и более современный, гораздо более гибкий способ сделать это!
Marc
ОБНОВЛЕНИЕ:
Когда я использую wsdl / server
в файле WSDL, я создаю этот файл:
[WebService(Namespace="http://.......")]
public abstract partial class OneCrmServiceType : System.Web.Services.WebService
{
/// <remarks/>
[WebMethod]
public abstract void OrderCreated(......);
}
По сути, это практически тот же код, который создается, когда вы добавляете файл ASMX в свое решение (в коде за файлом - yourservice.asmx.cs). Я не думаю, что вы можете приблизиться к созданию файла ASMX из файла WSDL.
Вы всегда можете добавить «yourservice.asmx» вручную - он действительно не содержит много: но модуль локали важен даже для правильного получения одного модуля. Показательный пример: в шведском "V" и "W" сортируются одинаково, поэтому вам нужно сопоставить их. locale
сделает все это за вас.). но модуль локали важен даже для правильного получения одного модуля. Показательный пример: в шведском «V» и «W» сортируются одинаково, поэтому вам нужно сопоставить их. locale
сделает все это за вас.).
В языковом стандарте POSIX
(не по умолчанию) это вернется к сортировке «a» после «Z».
Лично мне хотелось бы, чтобы в стандартной библиотеке Python было две функции (возможно, в functools ):
def compose(*funcs):
"""
Compose any number of unary functions into a single unary
function.
>>> import textwrap
>>> str.strip(textwrap.dedent(compose.__doc__)) == compose(str.strip, textwrap.dedent)(compose.__doc__)
True
"""
compose_two = lambda f1, f2: lambda v: f1(f2(v))
return reduce(compose_two, funcs)
def method_caller(method_name, *args, **kwargs):
"""
Return a function that will call a named method on the
target object with optional positional and keyword
arguments.
>>> lower = method_caller('lower')
>>> lower('MyString')
'mystring'
"""
def call_method(target):
func = getattr(target, method_name)
return func(*args, **kwargs)
return call_method
Я реализовал их для собственного использования в jaraco.util.functools .
В любом случае, теперь ваш код достаточно ясный, самодокументированный и надежный (IMO).
lower = method_caller('lower')
get_name = itemgetter('name')
lowered_name = compose(lower, get_name)
list_of_dicts.sort(key=lowered_name)
def lower_getter(field):
def _getter(obj):
return obj[field].lower()
return _getter
list_of_dicts.sort(key=lower_getter(key_field))