Подтвердить что ты не робот

Можете ли вы использовать типы LINQ и методы расширения в IronPython?

Можно ли использовать типы LINQ и методы расширения в IronPython?

Если да, то как? А также часто ли больше питонов делать то же самое?

4b9b3361

Ответ 1

IronPython 2.7, наконец, переводит этот пробел с помощью метода clr.ImportExtensions, который добавляет методы расширения из пространства имен в целевые типы, например.

>& 'C:\Program Files\IronPython 2.7\ipy.exe'
IronPython 2.7 (2.7.0.40) on .NET 4.0.30319.225
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> clr.AddReference("System.Core")
>>> from System.Collections.Generic import List
>>> dir (List)
['Add', 'AddRange', 'AsReadOnly', 'BinarySearch', 'Capacity', 'Clear', 'Contains', 'ConvertAll', 'CopyTo', 'Count', 'Enu
merator', 'Equals', 'Exists', 'Find', 'FindAll', 'FindIndex', 'FindLast', 'FindLastIndex', 'ForEach', 'GetEnumerator', '
GetHashCode', 'GetRange', 'GetType', 'IndexOf', 'Insert', 'InsertRange', 'IsReadOnly', 'IsSynchronized', 'Item', 'LastIn
dexOf', 'MemberwiseClone', 'ReferenceEquals', 'Remove', 'RemoveAll', 'RemoveAt', 'RemoveRange', 'Reverse', 'Sort', 'Sync
Root', 'ToArray', 'ToString', 'TrimExcess', 'TrueForAll', '__add__', '__class__', '__contains__', '__delattr__', '__doc_
_', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__new__', '__reduce
__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__']
>>> import System
>>> clr.ImportExtensions(System.Linq)
>>> dir (List)
['Add', 'AddRange', 'Aggregate', 'All', 'Any', 'AsEnumerable', 'AsParallel', 'AsQueryable', 'AsReadOnly', 'Average', 'Bi
narySearch', 'Capacity', 'Cast', 'Clear', 'Concat', 'Contains', 'ConvertAll', 'CopyTo', 'Count', 'DefaultIfEmpty', 'Dist
inct', 'ElementAt', 'ElementAtOrDefault', 'Enumerator', 'Equals', 'Except', 'Exists', 'Find', 'FindAll', 'FindIndex', 'F
indLast', 'FindLastIndex', 'First', 'FirstOrDefault', 'ForEach', 'GetEnumerator', 'GetHashCode', 'GetRange', 'GetType',
'GroupBy', 'GroupJoin', 'IndexOf', 'Insert', 'InsertRange', 'Intersect', 'IsReadOnly', 'IsSynchronized', 'Item', 'Join',
 'Last', 'LastIndexOf', 'LastOrDefault', 'LongCount', 'Max', 'MemberwiseClone', 'Min', 'OfType', 'OrderBy', 'OrderByDesc
ending', 'ReferenceEquals', 'Remove', 'RemoveAll', 'RemoveAt', 'RemoveRange', 'Reverse', 'Select', 'SelectMany', 'Sequen
ceEqual', 'Single', 'SingleOrDefault', 'Skip', 'SkipWhile', 'Sort', 'Sum', 'SyncRoot', 'Take', 'TakeWhile', 'ToArray', '
ToDictionary', 'ToList', 'ToLookup', 'ToString', 'TrimExcess', 'TrueForAll', 'Union', 'Where', 'Zip', '__add__', '__clas
s__', '__contains__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__',
 '__iter__', '__len__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__'
, '__str__', '__subclasshook__']
>>>

что приводит его в соответствие с методом IronRuby 1.1 using_clr_extensions.

Ответ 2

Некоторые из вещей, которые вы делаете с LINQ, могут выполняться со списком:

[myFunc(i) for i in numbers if i > 3]

Или вы можете использовать карту, уменьшить и фильтровать:

map(myFunc, filter(lambda x: x > 3, numbers))

Но переосмысления списков гораздо более "Pythonic", чем использование конструктов функционального программирования. Для уменьшения вещей рассмотрите возможность использования "". Join или sum. И вы можете проверить истинное значение целых итераций, используя любой и все

Просто запомните эти переводы:

Select -> map
Where -> filter
Aggregate -> reduce

И вам будет хорошо на вашем пути!

Ответ 3

В IronPython 2.7.1 у вас есть clr.ImportExtensions для этого варианта использования.

import clr
clr.AddReference("System.Core")
import System
clr.ImportExtensions(System.Linq)

# will print 3 and 4 :)
[2, 3, 4].Where(lambda x: x != 2).ToList().ForEach(System.Console.WriteLine)

Небольшой фон: IronPython 2.7 изначально представил эту функцию, но была проблема , которая остановила ее от реального использования.

Ответ 4

I описал класс оболочки С# вокруг методов расширения LINQ, чтобы получить синтаксис, аналогичный синтаксису С# с расширением канала в IronPython.

Идея состоит в том, чтобы иметь класс декоратора вокруг IEnumerable, который просто вызывает методы расширения. Вероятно, этот класс-оболочка может быть написан так же хорошо и в IronPython, но я еще не так бег на python: -)

public class ToLinq<T> : IEnumerable<T>
{
    private readonly IEnumerable<T> _wrapped;

    public ToLinq(IEnumerable<T> wrapped)
    {
       _wrapped = wrapped;
    }

    public ToLinq<T> Where(Func<T, bool> predicate)
    {
        return new ToLinq<T>(_wrapped.Where(predicate));
    }


    // ... similar methods for other operators like Select, Count, Any, ...

}

Это позволяет использовать синтаксис, подобный этому:

johns = ToLinq[Customer](customers)\
          .Where(lambda c: c.Name.StartsWith("John"))\
          .Select(lambda c: c.Name)

Отказ от ответственности: это то, что я пробовал как учебное упражнение, я не использовал это в реальном проекте.