Python for .NET et héritage

Python for .NET et héritage - C#/.NET managed - Programmation

Marsh Posté le 28-06-2005 à 16:40:10    

je viens de me mettre à utiliser Python for .Net (http://www.zope.org/Members/Brian/PythonNet) et j'ai un petit souci ... J'aurais besoin de faire communiquer l'appli et je pensais à une méthode qui me semblait assez élégante dans le principe :
 
du côté python :

Code :
  1. def startDL(stats):
  2. stat = {'updated':  'true'}
  3. stats.update(stat)


 
avec l'objet passé en tant que "stats" un objet purement C# dérivant de la classe PyObject proposée par la lib :
 

Code :
  1. public abstract class PyStatisticsUpdater : PyObject
  2. {
  3. // correctly forward the method calls
  4. new public PyObject InvokeMethod(string name, params PyObject[] args)
  5. {
  6.  if(name == "update" )
  7.   return update(new PyDict(args[0]));
  8.  return base.InvokeMethod(name, args);
  9. }
  10. new public PyObject InvokeMethod(string name, PyTuple args)
  11. {
  12.  if(name == "update" )
  13.   return update(new PyDict(args.GetItem("newStats" )));
  14.  return base.InvokeMethod(name, args);
  15. }
  16. new public PyObject InvokeMethod(string name, PyObject[] args, PyDict kw)
  17. {
  18.  if(name == "update" )
  19.   if(args.Length<1)
  20.    return update(new PyDict(kw.GetItem("newStats" )));
  21.   else
  22.    return update(new PyDict(args[0]));
  23.  return base.InvokeMethod(name, args, kw);
  24. }
  25. new public PyObject InvokeMethod(string name, PyTuple args, PyDict kw)
  26. {
  27.  if(name == "update" )
  28.   if(args.Length()<1)
  29.    return update(new PyDict(kw.GetItem("newStats" )));
  30.   else
  31.    return update(new PyDict(args[0]));
  32.  return base.InvokeMethod(name, args, kw);
  33. }
  34. public abstract PyObject update(PyDict newStats);
  35. }
  36. public class StatisticsUpdaterImp : PyStatisticsUpdater
  37. {
  38. override public PyObject update(PyDict newStats)
  39. {
  40.  string message = "--statistics :--\n\n";
  41.  for(int i=0; i<newStats.Keys().Length(); ++i)
  42.  {
  43.   string skey = newStats.Keys()[i].ToString();
  44.   message += skey + " =\n";
  45.   message += newStats.Keys()[i].ToString() + "\n\n";
  46.  }
  47.  MessageBox.Show(message);
  48.  return new Python.Runtime.PyInt(0);
  49. }
  50. }


 
le problème est bien évidemment d'arriver à faire un objet C# qui passe bien dedans les appels python.
 
Pour l'instant, je prends une exception avant même d'entrer dans le code python à vrai dire : je construis un dictionnaire python avec l'interface proposée par la lib, et l'ajout d'une instance de StatisticsUpdaterImp dans le dico lève une PythonException pas forcément très explicite
 
Je voulais simplement savoir si quelqu'un avait déjà tenté ce genre de subtilité (j'ai quelques doutes sur le fait que ce soit possible, à vrai dire) ou des remarques à me faire (étant donné que je ne suis à l'aise ni avec python, ni avec C# :sweat: )
 
merci d'avance.
 
Edit : ca pourra toujours être utile ... voilà les lignes qui conduisent à l'exception :

Code :
  1. PyDict argDict = new PyDict();
  2. argDict["destination"] = new PyString("c:\\temp\\" );
  3. argDict["stats"] = new StatisticsUpdaterImp();


Message édité par theshockwave le 28-06-2005 à 16:44:33
Reply

Marsh Posté le 28-06-2005 à 16:40:10   

Reply

Marsh Posté le 28-06-2005 à 16:55:44    

Apparamment, le problème viendrait du fait que l'objet ne sait pas de quel type il est, je continue à chercher dans cette direction ... Toute suggestion est bienvenue, cependant :D

Reply

Marsh Posté le 28-06-2005 à 19:07:35    

Bon ... Mieux, encore, j'ai tenté de charger un module et e n'y parviens pas ... Si quelqu'un sait comment modifier une variable d'environnement en C#, je suis preneur.

Reply

Marsh Posté le 29-06-2005 à 12:28:08    

mbon, il semblerait qu'après la mise en place du hook d'imports (pour intercepter les imports de CLR), les imports "normaux" ne passent plus ...
 
En clair, soit je peux faire des imports sur du CLR, soit je peux faire des imports sur des modules python classiques ... mais pas les deux à la fois :/
 
Toujours personne qui connait le sujet ?

Reply

Marsh Posté le 30-06-2005 à 16:10:33    

De plus en plus précis :
 
Python for .Net remplace la fonction d'import de python (__builtin__.__import__) par un appel à une de ses fonctions statiques internes tout en gardant une référence sur la méthode normale d'import.
 
Ainsi, si on fait un import sur CLR.quelque chose, Python for .Net peut intercepter l'appel (si ca ne commence pas par CLR, il fait suivre la demande d'import à la méthode 'sauvegardée')
 
Le problème vient lorsque je demande à faire un import d'un module depuis mon code en C#, pourtant, le PythonEngine.Import() se contente d'appeler la lib python pour lui demander de faire l'appel à __builtin__.__import__ (qui pointe donc sur la fonction C# à ce moment là) et la méthode "foire" (j'ai encore du mal à comprendre tous les détails) dans ce cas là.
 
En revanche, si je vire le internal de la classe qui déclare le import en C# et que je l'utilise directement (donc plus de DLL intermédiaire), l'import fonctionne à merveille ...
 
Je me demande donc s'il n'y a pas une raison particulière que je ne connaitrais pas pour que cet appel échoue (je rappelle que la méthode import en C# fonctionne bien jusqu'à ce qu'on transmette l'appel à la DLL)

Reply

Marsh Posté le 19-07-2005 à 10:54:51    

theshockwave a écrit :

Si quelqu'un sait comment modifier une variable d'environnement en C#, je suis preneur.


 
 
si ca peut servir à quelqu'un ...
 
http://support.microsoft.com/defau [...] -us;829145

Citation :

SYMPTOMS
The System.Environment class has methods to read the environment variables. However, this class has no method to set the environment variables for the current process.


Citation :

STATUS
Microsoft has confirmed that this is a problem in the Microsoft products that are listed at the beginning of this article.


 :sweat:


Message édité par theshockwave le 19-07-2005 à 10:55:28
Reply

Marsh Posté le 19-07-2005 à 11:53:07    

priez pour qu'on tombe sur quelqu'un qui connaisse un peu C#, sinon on va encore bouffer du SetEnviron(key, value) ...

Reply

Marsh Posté le 19-07-2005 à 11:59:31    

explique ta vision des choses, parce que je découvre à peine le langage, là (et je dois avouer que j'ai du mal à voir sur quel point porte ta remarque)

Reply

Marsh Posté le 19-07-2005 à 12:07:00    

ben je l'ai déjà dit : y a la moitié des mecs qui font la bibli de .Net qui ont jamais fait de C#. C# propose des trucs sympatoches : surcharges de quelques opérateurs, et property.
 
Donc, on ne devrait plus jamais voir de get/set !
 
ici, on devrait avoir ça
 

Code :
  1. public class Env
  2. {
  3.   public string this[string key]
  4.     {
  5.       get
  6. {
  7.   System.Console.WriteLine("get[{0}]", key);
  8.   return "foo";
  9. }
  10.       set
  11. {
  12.   System.Console.WriteLine("set[{0}] = {1}", key, value);
  13. }
  14.     }
  15. }
  16. // pour pouvoir écrire       
  17. // env["blah"] = env["blih"] + "bar";


 
 
mais bon ne rêvons pas ... si tu regarder, y a plein de trucs pourris dans l'API, genre File.Get<machin>time(), etc, c'est loin d'être marginal ... c'est chiant

Reply

Marsh Posté le 19-07-2005 à 12:18:29    

Effectivement, je n'étais pas encore tombé sur ce genre de choses :/ Les quelques fonctionnalités que j'ai pu utiliser passaient bien par des properties, pour ma part.

Reply

Marsh Posté le 19-07-2005 à 12:18:29   

Reply

Marsh Posté le 19-07-2005 à 12:37:50    

ben t'as qu'à regarver object ...

Reply

Marsh Posté le 19-07-2005 à 17:44:21    

bien encore, avec les stream binary, tu as un
 
int Length { get; }
 
et  
 
void SetLength(int) { } ...

Reply

Marsh Posté le 19-07-2005 à 17:52:35    

Joli, ... Joli ... Effectivement, ca fait assez mal de voir ca

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed