TypeErrorException был необработанным IronPython

У меня есть скрипт, написанный на python, который я вызываю с помощью IronPython из C #. Но я сталкиваюсь с исключением, как только я вызываю метод, и он выбрасывается как исключение.

Это сценарий, который я вызываю:

import sys
import ctypes

class EAHashingAlgorithm():

def __init__(self):
    # shift amounts in each round
    self.r1Shifts = [ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22 ]
    self.r2Shifts = [ 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20 ]
    self.r3Shifts = [ 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23 ]
    self.r4Shifts = [ 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 ]

    self.hexChars = "0123456789abcdef"

def zero_fill_right_shit(self, data, bits):
    return (data & 0xffffffff) >> bits

def num2hex(self, num):
    '''
        Convert a decimal number to hexadecimal
    '''
    temp = ''
    for i in range(0, 4):
        x = self.hexChars[ ( num >> (i * 8 + 4) ) & 0x0F ]
        y = self.hexChars[ ( num >> (i * 8) ) & 0x0F ]
        temp += (x + y)

    return temp

def chunkMessage(self, string):
    # TODO: ctypes.c_int32() in this method
    nblk = (( len(string) + 8) >> 6) + 1
    blks = [0] * (nblk * 16)

    for i in range(0, len(string)):
        blks[i >> 2] |= ord(string[i]) << ((i % 4) * 8)

    i = i + 1

    blks[i >> 2] |= 0x80 << ((i % 4) * 8)
    blks[nblk * 16 - 2] = len(string) * 8

    return blks

def add(self, x, y):
    lsw = (x & 0xFFFF) + (y & 0xFFFF)
    msw = (ctypes.c_int32(x >> 16).value) + (ctypes.c_int32(y >> 16).value) + (ctypes.c_int32(lsw >> 16).value)
    return ctypes.c_int32( (ctypes.c_int32(msw << 16).value) | (lsw & 0xFFFF) ).value

# Bitwise rotate 32bit num to left
def bitwiseRotate(self, x, c):
    return ctypes.c_int32( ctypes.c_int32(x << c).value | self.zero_fill_right_shit(x, 32 - c) ).value

# Basic MD5 operations
def cmn(self, q, a, b, x, s, t):
    z1 = self.add(a, q)
    z2 = self.add(x, t) 
    a1 = self.add(z1, z2)

    x1 = self.bitwiseRotate(a1, s)
    return self.add(x1, b)

def md5_f(self, a, b, c, d, x, s, t):
    return self.cmn( ctypes.c_int32((b & c) | ((~b) & d)).value, a, b, x, s, t )

def md5_g(self, a, b, c, d, x, s, t):
    return self.cmn( ctypes.c_int32((b & d) | (c & (~d))).value, a, b, x, s, t )

def md5_h(self, a, b, c, d, x, s, t):
    return self.cmn( ctypes.c_int32(b ^ c ^ d).value, a, b, x, s, t )

def md5_i(self, a, b, c, d, x, s, t):
    return self.cmn( ctypes.c_int32(c ^ (b | (~d))).value, a, b, x, s, t )

def EAHash(self, string):
    x = self.chunkMessage(string)

    a = 1732584193
    b = -271733879
    c = -1732584194
    d = 271733878

    for i in range(0, 16, 16):
        tempA = a
        tempB = b
        tempC = c
        tempD = d

        # F
        a = self.md5_f(a, b, c, d, x[i+0], self.r1Shifts[0], -680876936)
        d = self.md5_f(d, a, b, c, x[i+1], self.r1Shifts[1], -389564586)
        c = self.md5_f(c, d, a, b, x[i+2], self.r1Shifts[2], 606105819)
        b = self.md5_f(b, c, d, a, x[i+3], self.r1Shifts[3], -1044525330)

        a = self.md5_f(a, b, c, d, x[i+4], self.r1Shifts[4], -176418897)
        d = self.md5_f(d, a, b, c, x[i+5], self.r1Shifts[5], 1200080426)
        c = self.md5_f(c, d, a, b, x[i+6], self.r1Shifts[6], -1473231341)
        b = self.md5_f(b, c, d, a, x[i+7], self.r1Shifts[7], -45705983)

        a = self.md5_f(a, b, c, d, x[i+8], self.r1Shifts[8], 1770035416)
        d = self.md5_f(d, a, b, c, x[i+9], self.r1Shifts[9], -1958414417)
        c = self.md5_f(c, d, a, b, x[i+10], self.r1Shifts[10], -42063)
        b = self.md5_f(b, c, d, a, x[i+11], self.r1Shifts[11], -1990404162)

        a = self.md5_f(a, b, c, d, x[i+12], self.r1Shifts[12], 1804603682)
        d = self.md5_f(d, a, b, c, x[i+13], self.r1Shifts[13], -40341101)
        c = self.md5_f(c, d, a, b, x[i+14], self.r1Shifts[14], -1502002290)
        b = self.md5_f(b, c, d, a, x[i+15], self.r1Shifts[15], 1236535329)

        # G
        a = self.md5_g(a, b, c, d, x[i+1], self.r2Shifts[0], -165796510)
        d = self.md5_g(d, a, b, c, x[i+6], self.r2Shifts[1], -1069501632)
        c = self.md5_g(c, d, a, b, x[i+11], self.r2Shifts[2], 643717713)
        b = self.md5_g(b, c, d, a, x[i+0], self.r2Shifts[3], -373897302)

        a = self.md5_g(a, b, c, d, x[i+5], self.r2Shifts[4], -701558691)
        d = self.md5_g(d, a, b, c, x[i+10], self.r2Shifts[5], 38016083)
        c = self.md5_g(c, d, a, b, x[i+15], self.r2Shifts[6], -660478335)
        b = self.md5_g(b, c, d, a, x[i+4], self.r2Shifts[7], -405537848)

        a = self.md5_g(a, b, c, d, x[i+9], self.r2Shifts[8], 568446438)
        d = self.md5_g(d, a, b, c, x[i+14], self.r2Shifts[9], -1019803690)
        c = self.md5_g(c, d, a, b, x[i+3], self.r2Shifts[10], -187363961)
        b = self.md5_g(b, c, d, a, x[i+8], self.r2Shifts[11], 1163531501)

        a = self.md5_g(a, b, c, d, x[i+13], self.r2Shifts[12], -1444681467)
        d = self.md5_g(d, a, b, c, x[i+2], self.r2Shifts[13], -51403784)
        c = self.md5_g(c, d, a, b, x[i+7], self.r2Shifts[14], 1735328473)
        b = self.md5_g(b, c, d, a, x[i+12], self.r2Shifts[15], -1926607734)

        # H
        a = self.md5_h(a, b, c, d, x[i+5], self.r3Shifts[0], -378558)
        d = self.md5_h(d, a, b, c, x[i+8], self.r3Shifts[1], -2022574463)
        # line below uses self.r2Shifts[2] where as MD5 would use self.r3Shifts[2]
        c = self.md5_h(c, d, a, b, x[i+11], self.r2Shifts[2], 1839030562)
        b = self.md5_h(b, c, d, a, x[i+14], self.r3Shifts[3], -35309556)

        a = self.md5_h(a, b, c, d, x[i+1], self.r3Shifts[4], -1530992060)
        d = self.md5_h(d, a, b, c, x[i+4], self.r3Shifts[5], 1272893353)
        c = self.md5_h(c, d, a, b, x[i+7], self.r3Shifts[6], -155497632)
        b = self.md5_h(b, c, d, a, x[i+10], self.r3Shifts[7], -1094730640)

        a = self.md5_h(a, b, c, d, x[i+13], self.r3Shifts[8], 681279174)
        d = self.md5_h(d, a, b, c, x[i+0], self.r3Shifts[9], -358537222)
        c = self.md5_h(c, d, a, b, x[i+3], self.r3Shifts[10], -722521979)
        b = self.md5_h(b, c, d, a, x[i+6], self.r3Shifts[11], 76029189)

        a = self.md5_h(a, b, c, d, x[i+9], self.r3Shifts[12], -640364487)
        d = self.md5_h(d, a, b, c, x[i+12], self.r3Shifts[13], -421815835)
        c = self.md5_h(c, d, a, b, x[i+15], self.r3Shifts[14], 530742520)
        b = self.md5_h(b, c, d, a, x[i+2], self.r3Shifts[15], -995338651)

        # I
        a = self.md5_i(a, b, c, d, x[i+0], self.r4Shifts[0], -198630844)
        d = self.md5_i(d, a, b, c, x[i+7], self.r4Shifts[1], 1126891415)
        c = self.md5_i(c, d, a, b, x[i+14], self.r4Shifts[2], -1416354905)
        b = self.md5_i(b, c, d, a, x[i+5], self.r4Shifts[3], -57434055)

        a = self.md5_i(a, b, c, d, x[i+12], self.r4Shifts[4], 1700485571)
        d = self.md5_i(d, a, b, c, x[i+3], self.r4Shifts[5], -1894986606)
        c = self.md5_i(c, d, a, b, x[i+10], self.r4Shifts[6], -1051523)
        b = self.md5_i(b, c, d, a, x[i+1], self.r4Shifts[7], -2054922799)

        a = self.md5_i(a, b, c, d, x[i+8], self.r4Shifts[8], 1873313359)
        d = self.md5_i(d, a, b, c, x[i+15], self.r4Shifts[9], -30611744)
        c = self.md5_i(c, d, a, b, x[i+6], self.r4Shifts[10], -1560198380)
        b = self.md5_i(b, c, d, a, x[i+13], self.r4Shifts[11], 1309151649)

        a = self.md5_i(a, b, c, d, x[i+4], self.r4Shifts[12], -145523070)
        d = self.md5_i(d, a, b, c, x[i+11], self.r4Shifts[13], -1120210379)
        c = self.md5_i(c, d, a, b, x[i+2], self.r4Shifts[14], 718787259)
        b = self.md5_i(b, c, d, a, x[i+9], self.r4Shifts[15], -343485551)
        # This line is doubled for some reason, line below is not in the MD5 version
        b = self.md5_i(b, c, d, a, x[i+ 9], self.r4Shifts[15], -343485551)

        a = self.add(a, tempA)
        b = self.add(b, tempB)
        c = self.add(c, tempC)
        d = self.add(d, tempD)

    return self.num2hex(a) + self.num2hex(b) + self.num2hex(c) + self.num2hex(d)

Вот как я вызываю метод в классе:

ScriptSource source = engine.CreateScriptSourceFromFile("EAHashingAlgorithm.py");
        ScriptScope scope = engine.CreateScope();
        engine.SetSearchPaths(new[] { "C:/Program Files (x86)/IronPython 2.7/Lib" });
        source.Execute(scope);

        dynamic eaHash = scope.GetVariable("EAHashingAlgorithm");
        dynamic hash = eaHash();
        this.answer = hash.EAHash(_answer); //lets suppose the answer is "123456"

Это исключает следующее:

expected signed long, got long

Это stacktrace:

at IronPython.Modules.ModuleOps.GetSignedLong(Object value, Object type)
   at IronPython.Modules.CTypes.SimpleType.IronPython.Modules.CTypes.INativeType.SetValue(MemoryHolder owner, Int32 offset, Object value)
   at IronPython.Modules.CTypes.SimpleCData.__init__(Object value)
   at CallSite.Target(Closure , CallSite , CodeContext , Object , Object )
   at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
   at Microsoft.Scripting.Interpreter.DynamicInstruction`4.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0, T1 arg1, T2 arg2, T3 arg3)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
   at Microsoft.Scripting.Interpreter.DynamicInstruction`4.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0, T1 arg1, T2 arg2, T3 arg3)
   at IronPython.Compiler.PythonCallTargets.OriginalCallTarget3(PythonFunction function, Object arg0, Object arg1, Object arg2)
   at IronPython.Runtime.FunctionCaller`3.Call3(CallSite site, CodeContext context, Object func, T0 arg0, T1 arg1, T2 arg2)
   at IronPython.Runtime.Method.MethodBinding`2.SelfTarget(CallSite site, CodeContext context, Object target, T0 arg0, T1 arg1)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute4[T0,T1,T2,T3,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3)
   at Microsoft.Scripting.Interpreter.DynamicInstruction`5.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run8[T0,T1,T2,T3,T4,T5,T6,T7,TRet](T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)
   at IronPython.Compiler.PythonCallTargets.OriginalCallTarget7(PythonFunction function, Object arg0, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6)
   at IronPython.Runtime.FunctionCaller`7.Call7(CallSite site, CodeContext context, Object func, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute9[T0,T1,T2,T3,T4,T5,T6,T7,T8,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)
   at IronPython.Runtime.Method.MethodBinding`6.SelfTarget(CallSite site, CodeContext context, Object target, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute8[T0,T1,T2,T3,T4,T5,T6,T7,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)
   at Microsoft.Scripting.Interpreter.DynamicInstruction`9.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run9[T0,T1,T2,T3,T4,T5,T6,T7,T8,TRet](T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)
   at IronPython.Compiler.PythonCallTargets.OriginalCallTarget8(PythonFunction function, Object arg0, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7)
   at IronPython.Runtime.FunctionCaller`8.Call8(CallSite site, CodeContext context, Object func, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute10[T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)
   at IronPython.Runtime.Method.MethodBinding`7.SelfTarget(CallSite site, CodeContext context, Object target, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute9[T0,T1,T2,T3,T4,T5,T6,T7,T8,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)
   at Microsoft.Scripting.Interpreter.DynamicInstruction`10.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run3[T0,T1,T2,TRet](T0 arg0, T1 arg1, T2 arg2)
   at IronPython.Compiler.PythonCallTargets.OriginalCallTarget2(PythonFunction function, Object arg0, Object arg1)
   at IronPython.Runtime.FunctionCaller`2.Call2(CallSite site, CodeContext context, Object func, T0 arg0, T1 arg1)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute4[T0,T1,T2,T3,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3)
   at CallSite.Target(Closure , CallSite , Object , String )
   at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
   at CallSite.Target(Closure , CallSite , Object , String )
   at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
   at FUTBuyer.FUT.ConnectFUT.work(String _uname, String _password, String _answer, String _platform) in E:\Projects\FUTBuyer\FUTBuyer\FUT\ConnectFUT.cs:line 214
   at FUTBuyer.FUT.ConnectFUT..ctor(String userName, String password, String secretAnswer, String platform) in E:\Projects\FUTBuyer\FUTBuyer\FUT\ConnectFUT.cs:line 58
   at FUTBuyer.Form1.button1_Click(Object sender, EventArgs e) in E:\Projects\FUTBuyer\FUTBuyer\Form1.cs:line 21
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at FUTBuyer.Program.Main() in E:\Projects\FUTBuyer\FUTBuyer\Program.cs:line 18
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Код работает нормально при запуске с использованием только python. Я использую IronPython, версия 2.7.3. Помогите кому-нибудь?

1
nl ja de
@SimonOpelt, как я могу запустить на компьютере Intel?
добавлено автор faizanjehangir, источник
Можете ли вы сказать, какие версии ironpython я должен использовать, чтобы заставить его работать. Я хочу придерживаться .NET 4.0 тем временем.
добавлено автор faizanjehangir, источник
Есть ли проблемы с этой проблемой? Мне действительно нужно заставить его работать. Я так долго застрял в этой проблеме.
добавлено автор faizanjehangir, источник
Я смог воспроизвести проблему, используя следующий (упрощенный) код: import ctypes; x = 24946365440L; y = ctypes.c_int32 (x); . Он работает на 2.7.3 (по умолчанию, 10 апреля 2012, 23:24:47) [MSC v.1500 64 бит (AMD64)] и не работает 2.7.3 (IronPython 2.7.3 (2.7.0.40) в .NET 4.0.30319.18010 (64-разрядная версия)) .
добавлено автор Simon Opelt, источник
Я еще не смог разрешить или обойти проблему на IronPython. Я просто предоставил минимальный образец воспроизведения ошибок и точные версии, которые я использовал.
добавлено автор Simon Opelt, источник

1 ответы

Проблема, похоже, связана с тем, как IronPython ctypes.c_int32 обрабатывает длинные значения, превышающие максимальное целочисленное значение. Это может быть либо общей разницей времени выполнения, либо реализацией ctypes.

Чтобы достичь такого же поведения, как и в CPython (как обходной путь), вы должны убедиться, что в c_int32 не передается аргумент, превышающий максимальный целочисленный размер. Но, глядя на ваш код, это, вероятно, не то, что вы хотите, потому что вы, кажется, вызываете c_int32 только по той причине, что усекаете результаты сдвига, поступающие в дальний диапазон.

Вы считали маскировку вместо c_int32? Это может иметь последствия для производительности, но это зависит от вашего варианта использования/алгоритма. Вместо

ctypes.c_int32(x).value

ты мог

x & 0xffffffff

и ваши результаты должны оставаться неизменными.

To be sure ты мог file a bug with IronPython which is probably your best chance of finding out why IronPython behaves different to CPython.

1
добавлено
Это было так ... Я немного перефразировал, и это сработало как шарм.
добавлено автор faizanjehangir, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community