[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    [PyQt] SIP and QString
From:       Luca Beltrame <einar () heavensinferno ! net>
Date:       2012-11-18 15:36:14
Message-ID: 7277347.qGtjqMUA3W () leon ! lan
[Download RAW message or body]

[Attachment #2 (multipart/signed)]

[Attachment #4 (multipart/mixed)]


Hello,

while testing PyKDE4's modules with Python3, I noticed that the i18n() calls, 
which accept const char*, are not properly handled in Python 3 (both with API 
version 1 and 2):

In [2]: from PyKDE4.kdecore import i18n

In [3]: i18n("Test")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-00970cb5d435> in <module>()
----> 1 i18n("Test")

TypeError: i18n(): argument 1 has unexpected type 'str'

It does work if I pass bytes, but that's not correct, as we're dealing with 
strings here.

PyQt documentation states that char* or const char* would be acceptable with 
strings (Python 3 strings). 

As the original SIP file had custom code inside, I'm attaching it here. I 
looked at it briefly, but I couldn't find why it didn't work.

Can anyone shed a light on this issue?


-- 
Luca Beltrame - KDE Forums team
KDE Science supporter
GPG key ID: 6E1A4E79

["klocalizedstring.sip" (klocalizedstring.sip)]

//
//     Copyright 2008 Jim Bublitz <jbublitz@nwinternet.com>
//     Earlier copyrights 1998 - 2007 Jim Bublitz also apply

//                 Generated by twine

// This file is part of PyKDE4.

// PyKDE4 is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of
// the License, or (at your option) any later version.

// PyKDE4 is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.


class KLocalizedString
{
%TypeHeaderCode
#include <klocalizedstring.h>
%End


public:
    explicit                KLocalizedString ();
                            KLocalizedString (const KLocalizedString& rhs);
    QString                 toString () const;
    QString                 toString (const KLocale* locale) const;
    bool                    isEmpty () const;
//ig    KLocalizedString        subs (int a, int fieldWidth = 0, int base = 10, const \
QChar& fillChar = QLatin1Char(' ')) const; //ig    KLocalizedString        subs (uint \
a, int fieldWidth = 0, int base = 10, const QChar& fillChar = QLatin1Char(' ')) \
const; //ig    KLocalizedString        subs (long a, int fieldWidth = 0, int base = \
10, const QChar& fillChar = QLatin1Char(' ')) const; //ig    KLocalizedString        \
subs (ulong a, int fieldWidth = 0, int base = 10, const QChar& fillChar = \
QLatin1Char(' ')) const;  KLocalizedString        subs (qlonglong a, int fieldWidth = \
0, int base = 10, const QChar& fillChar = QLatin1Char(' ')) const; //ig    \
KLocalizedString        subs (qulonglong a, int fieldWidth = 0, int base = 10, const \
QChar& fillChar = QLatin1Char(' ')) const; //ig    KLocalizedString        subs \
(double a, int fieldWidth = 0, char format = 'g', int precision = -1, const QChar& \
fillChar = QLatin1Char(' ')) const;  KLocalizedString        subs (QChar a, int \
fieldWidth = 0, const QChar& fillChar = QLatin1Char(' ')) const;  KLocalizedString    \
subs (const QString& a, int fieldWidth = 0, const QChar& fillChar = QLatin1Char(' ')) \
const;  KLocalizedString        inContext (const QString& key, const QString& text) \
const; //ig    static void             notifyCatalogsUpdated (const QStringList& \
languages, const QList<KCatalogName>& catalogs);

private:
                            KLocalizedString (const char* ctxt, const char* msg, \
const char* plural); public:
    ~KLocalizedString ();
    QString                 toString (const QString& catalogName) const;
    QString                 toString (const KLocale* locale, const QString& \
catalogName) const; };
// KLocalizedString

KLocalizedString        ki18n (const char* msg);
KLocalizedString        ki18nc (const char* ctxt, const char* msg);
KLocalizedString        ki18np (const char* singular, const char* plural);
KLocalizedString        ki18ncp (const char* ctxt, const char* singular, const char* \
plural); QString                 tr2i18n (const char* message, const char* comment = \
0);

//ig class I18nTypeCheck;

%ModuleCode
QString klocalizedstring_i18n_template(KLocalizedString base, PyObject *list,int \
*sipIsErr) {  KLocalizedString result = base;    
    QString *arg;
    long long_arg;
    double double_arg;
    int iserr = 0;

    for (int i=0; i < PyTuple_Size(list); i++) {
        PyObject *pyarg = PyTuple_GET_ITEM (list, i);
#if PY_MAJOR_VERSION >= 3
        if (PyLong_Check(pyarg)) {
            long_arg = PyLong_AsLong(pyarg);
#else
        if (PyInt_Check(pyarg)) {
            long_arg = PyInt_AsLong(pyarg);
#endif            
            if (long_arg==-1 && PyErr_Occurred()) {
                *sipIsErr = 1;
                return QString();
            }
            result = result.subs(long_arg);

#if PY_MAJOR_VERSION >= 3
        } else if (PyNumber_Check(pyarg)) {
            PyObject *long_py = PyNumber_Long(pyarg);
            long_arg = PyLong_AsLong(long_py);
            Py_DECREF(long_py);
#else
        } else if (PyLong_Check(pyarg)) {
            long_arg = PyLong_AsLong(pyarg);
#endif
            if (long_arg==-1 && PyErr_Occurred()) {
                *sipIsErr = 1;
                return QString();
            }
            result = result.subs(long_arg);

        } else if (PyFloat_Check(pyarg)) {
            double_arg = PyFloat_AsDouble(pyarg);
            result = result.subs(double_arg);

        } else {
          int state = 0;
          arg = (QString *)sipForceConvertToType(pyarg, sipType_QString, NULL, \
SIP_NOT_NONE, &state, &iserr);  if (iserr) {
              *sipIsErr = 1;
              return QString();
          }
  
          result = result.subs(*arg);
          sipReleaseType(arg,sipType_QString,state);
          arg = 0;
          }
    }

    return result.toString();
}
%End

//ig class I18nTypeCheck;

//force
QString                 i18n (const char* text, ...);
%MethodCode
    QString result = klocalizedstring_i18n_template(ki18n(a0),a1,&sipIsErr);
    if (!sipIsErr) {
        sipRes = new QString(result);
    }
%End

QString                 i18nc (const char* ctxt, const char* text, ...);
%MethodCode
    QString result = klocalizedstring_i18n_template(ki18nc(a0,a1),a2,&sipIsErr);
    if (!sipIsErr) {
        sipRes = new QString(result);
    }
%End

QString                 i18np (const char* sing, const char* plur, ...);
%MethodCode
    QString result = klocalizedstring_i18n_template(ki18np(a0,a1),a2,&sipIsErr);
    if (!sipIsErr) {
        sipRes = new QString(result);
    }
%End

QString                 i18ncp (const char* ctxt, const char* sing, const char* plur, \
...); %MethodCode
    QString result = klocalizedstring_i18n_template(ki18ncp(a0,a1,a2),a3,&sipIsErr);
    if (!sipIsErr) {
        sipRes = new QString(result);
    }
%End
//end
%ModuleHeaderCode
#include <klocalizedstring.h>
%End


//ig QString                 i18n (const char* text);
//ig QString                 i18nc (const char* ctxt, const char* text);


["signature.asc" (application/pgp-signature)]

_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic