Changeset 11065:d374411d8f22 in orange


Ignore:
Timestamp:
01/09/13 01:00:54 (15 months ago)
Author:
Janez Demšar <janez.demsar@…>
Branch:
default
Message:

Added property 'name' that resolves to an attribute name, if it exists,
otherwise it returns the class name with the first letter in lowercase and
without the suffix 'Learner', 'Classifier' or 'Discretization'.

Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • source/orange/cls_orange.cpp

    r10673 r11065  
    393393    } 
    394394  
    395     if (!strcmp(name, "name") || !strcmp(name, "shortDescription") || !strcmp(name, "description")) 
    396       return PyString_FromString(""); 
    397  
    398395    PyErr_Format(PyExc_AttributeError, "'%s' has no attribute '%s'", self->ob_type->tp_name, name); 
    399396    return PYNULL; 
     
    10251022 
    10261023 
     1024char const *genericNames[] = {"Classifier", "Learner", "Discretizer", NULL}; 
     1025 
     1026PyObject *Orange_get_name(TPyOrange *self) 
     1027{ 
     1028  PyTRY 
     1029    PyObject *pyname = Orange_getattr1(self, "name"); 
     1030    if (!pyname) {  
     1031      PyErr_Clear(); 
     1032      if (self->orange_dict) { 
     1033        pyname = PyDict_GetItemString(self->orange_dict, "name"); 
     1034        Py_XINCREF(pyname); 
     1035      } 
     1036    } 
     1037    if (pyname) { 
     1038      if (PyString_Check(pyname)) { 
     1039        return pyname; 
     1040      } 
     1041      PyObject *pystr = PyObject_Repr(pyname); 
     1042      Py_DECREF(pyname); 
     1043      return pystr; 
     1044    } 
     1045 
     1046    char const *tp_name = self->ob_type->tp_name; 
     1047    char const *dotp = tp_name + strlen(tp_name); 
     1048    while((dotp != tp_name) && (*dotp != '.')) { 
     1049      dotp--; 
     1050    } 
     1051    if (*dotp == '.') { 
     1052      dotp++; 
     1053    } 
     1054    if (*dotp == '_') { 
     1055      dotp++; 
     1056    } 
     1057    char *name = (char *)malloc(strlen(dotp) + 1); 
     1058    strcpy(name, dotp); 
     1059 
     1060    const int lenname = strlen(name); 
     1061    char *nameend = name + lenname; 
     1062    for(char const *const *gen = genericNames; *gen; gen++) { 
     1063        if (strlen(*gen) < lenname) { 
     1064            char *cap = nameend - strlen(*gen); 
     1065            if (!strcmp(cap, *gen)) { 
     1066              *cap = 0; 
     1067              break; 
     1068            } 
     1069        } 
     1070    } 
     1071    if ((*name >= 'A') && (*name <= 'Z')) { 
     1072      *name ^= 32; 
     1073      } 
     1074    return PyString_FromString(name); 
     1075  PyCATCH 
     1076} 
     1077 
     1078 
     1079 
     1080int Orange_set_name(TPyOrange *self, PyObject *arg) 
     1081{ 
     1082  PyTRY 
     1083    int res = Orange_setattr1(self, "name", arg); 
     1084    if (res == 1) { 
     1085        res = Orange_setattrDictionary(self, "name", arg, false); 
     1086    } 
     1087    return res; 
     1088  PyCATCH_1 
     1089} 
     1090 
     1091 
    10271092int Orange_nonzero(PyObject *self) 
    10281093{ PyTRY 
Note: See TracChangeset for help on using the changeset viewer.