Pouvez-vous utiliser les types de LINQ et les méthodes d'extension dans IronPython?

est-il possible d'utiliser les types de LINQ et les méthodes d'extension dans IronPython?

Si oui, comment? Et il y a souvent plus de pythonic pour faire la même chose?

34
demandé sur Ólafur Waage 2009-03-10 02:53:22

4 réponses

IronPython 2.7 comble enfin cette lacune avec le clr.ImportExtensions méthode qui ajoute les méthodes d'extension d'un espace de noms aux types cibles par ex.

>& '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__']
>>>

ce qui l'harmonise avec IronRuby 1.1's using_clr_extensions méthode.

41
répondu Steve Gilham 2011-04-06 21:00:47

certaines choses que vous feriez avec LINQ peuvent être faites avec des compréhensions de liste:

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

Ou vous pouvez utiliser la carte, de réduire et de filtre:

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

mais les compréhensions de liste sont beaucoup plus" Pythoniques " qu'en utilisant les constructions de programmation fonctionnelles. Pour réduire les choses, envisagez d'utiliser "".rejoignez ou somme. Et vous pouvez vérifier la valeur de vérité des itérables entiers en utilisant et

Juste rappelez-vous ces traductions:

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

Et vous serez bien sur votre chemin!

23
répondu Patrick 2009-03-10 00:25:52

IronPython 2.7.1 vous avez clr.ImportExtensions pour ce cas d'utilisation.

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)

un petit fond: IronPython 2.7 a d'abord introduit cette fonctionnalité, mais il y avait problème qui l'ont empêché d'être vraiment utilisable.

11
répondu Simon Opelt 2012-02-19 19:37:00

I décrit une Classe C# wrapper autour des méthodes D'extension de LINQ pour obtenir une syntaxe similaire à la syntaxe de C#'S 'chained extension method' dans IronPython.

L'idée est d'avoir une sorte de décorateur de classe autour de IEnumerable qui appelle simplement les méthodes d'extension. Probablement cette classe de wrapper peut être écrite aussi bien en IronPython, mais je ne parle pas encore aussi couramment en 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, ...

}

Cela permet une syntaxe similaire à ceci:

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

avertissement: c'est quelque chose que j'ai essayé comme un exercice d'apprentissage, Je ne l'ai pas utilisé dans un projet du monde réel.

3
répondu jeroenh 2010-08-26 09:02:15