2010-02-15 19 views
8

Ich versuche, das folgende C# -Beispiel, das ein IronPython-Modul erstellt, in F # zu übersetzen.Verwenden von Assembly-Attributen in F #

using System; 
using IronPython.Runtime; 

[assembly: PythonModule("my_module", typeof(MyModule))] 

public static class MyModule { 
    public static void hello_world() { 
     Console.WriteLine("hello world"); 
    } 
} 

Verwendung von PythonModule ermöglicht from my_module import *, unter anderem.

Ich habe Probleme herauszufinden, wie das PythonModule-Attribut in F # anwenden. Die F # -Dokumentation spricht nur über Assembly-Attribute, die sich auf Module beziehen, und ist an do() angefügt. Es ist mir nicht klar, wie man statische Klassen definiert, die als Python-Module interpretiert werden, aber ich bin kein C#/F #/IronPython-Experte.

Antwort

6

Ich habe nicht alle Bits bei der Hand, um zu sehen, ob das funktioniert, aber ich würde

open System 
open IronPython.Runtime 

type MyModule = 
    static member hello_world() = 
     Console.WriteLine("hello world") 

module DummyModuleOnWhichToAttachAssemblyAttribute = 
    [<assembly: PythonModule("my_module", typeof<MyModule>)>] 
    do() 

für den Anfang versuchen.

+0

Das funktioniert. Nach dem Hinzufügen der DLL funktioniert 'import my_module' wie erwartet. Das Dummy-Modul wirkt ein wenig witzig, aber damit kann ich leben. – Tristan

4

Hat es nicht, aber ...

module MyModule 

open System 
open IronPython.Runtime 

let hello_world() = 
    Console.WriteLine "Hello, World." 

[<assembly: PythonModule("my_module", typeof<MyModule>)>] 
do() 

Gleiche wie Brians getestet, aber ohne das Dummy-Modul.

+0

Ich habe Angst, dass 'typeof ' nicht für 'MyModule' funktioniert, weil es kein Typ ist, sondern ein Modul (zumindest hat es nicht, das letzte Mal habe ich überprüft). Dies ist eine ärgerliche Einschränkung, denn das Schreiben von F # -Funktionen anstelle von statischen Klassen wäre einfach großartig! –

+0

(Ich würde fast eine wirklich fieses Workaround verwenden, um dies zum Laufen zu bringen, weil es einfach so einfach wäre, einfache F # -Funktionen zu schreiben - zB könnte man das 'assembly' -Attribut in C# schreiben und dann" ILMerge "verwenden one) –

+0

Ich möchte auch kein Modul direkt verwenden, da ich hello_world nicht überlasten kann. Durch die Verwendung von statischen Methoden bekomme ich Funktionen in Python überlastet. – Tristan