Ipython: لا يمكن إنشاء كتل تعليمات برمجية متعددة الأسطر في إيبثون

تم إنشاؤها على ٢٧ سبتمبر ٢٠١٨  ·  26تعليقات  ·  مصدر: ipython/ipython

لقد قمت للتو بعمل pip install ipython أثناء تدريس فصل اليوم وكتبت عبارة if ثم اضغط على Enter بعد السطر الأول وتم تنفيذ الكود.

هذا يبدو وكأنه خطأ.

لقد قمت بعمل pip install ipython==6.5.0 وأظهر لي الضغط على Enter في كتلة التعليمات البرمجية بشكل صحيح السطر التالي ذي المسافة البادئة للكتابة.

أنا على Ubuntu 18.04 أقوم بتشغيل ipython داخل tmux ، على الرغم من أنني أشك في أن tmux هي المشكلة هنا.

Hacktoberfest help wanted

التعليق الأكثر فائدة

في الواقع ، حصلت على تراجع مع الإصلاح. إصلاحه الآن.

تم تحديث PR # 11354 الآن.

ال 26 كومينتر

يمكنك استخدام ctrl-o لفرض سطر جديد.

لم أكن لأخمن ذلك أبدا. لست متأكدًا من كيفية توضيح ذلك بشكل أكبر ، لكنني أعتقد أنه يتطلب بعض التوضيح / الإمساك باليد. لقد جربت كل اختصار يمكنني التفكير فيه وانتهى بي الأمر بإجبار على الرجوع إلى إصدار أقدم لإصلاح مشكلتي.

أستخدم IPython لتسهيل كتابة وتحرير الكتل متعددة الأسطر في REPL أثناء تدريس الجماهير الحية. أظن أن الآخرين في وضعي قد يكون لديهم مشكلات مماثلة.

ربما تحذير في مكان ما يشير إلى أنه يمكن استخدام Ctrl-O لإنشاء كتلة كود متعددة الأسطر؟ لست متأكدًا مما إذا كان هناك مكان مناسب لذلك.

إنه خطأ في معاد تصنيع حديث ، كنت أحاول فقط إخبارك أنه يمكنك استخدام Ctrl-O في هذه الأثناء إذا كنت ترغب في استخدام 7.x

آه عظيم! أنا سعيد لأنه كان مجرد خطأ. Carreau شكرا! 😄

هل تمانع في إعطائي بعض الأمثلة (العمل وليس العمل) لما تتوقعه ، من أجل تقديم اختبار للإصلاحات؟

لدي بعض لكن فقط أجمع القليل ولا أريد التأثير عليك.

with open('hello.txt', mode='wt') as my_file:
    my_file.write('hi')
    my_file.write('hi again')

لا يمكنني تذكر المثال الثاني ، ولكن عدد من الحلقات:

numbers = [2, 1, 3, 4, 7, 8, 11]

for n in numbers:
    if n > 0:
        print(n*2)
    else:
        print(n/2)

Carreau هل هناك شخص يعمل على هذه القضية؟ سأكون سعيدا للمساعدة

مرحبًا @ Deborah-Digges ، لقد ألقيت نظرة سريعة ولكن ليس كثيرًا حتى الآن.

لقد كتبت هذه الحالة الاختبارية الصغيرة لمعرفة الفرق بين input_splitter القديم ومحول الإدخال الجديد:

from IPython.core import inputtransformer2 as ipt2 # new way
from IPython.core import inputsplitter #oldl way

occ =  inputsplitter.InputSplitter().check_complete
cc = ipt2.TransformerManager().check_complete

comp = lambda x : (cc(x), occ(x), x)
print(comp('if'))
print(comp('if\n\n'))
print(comp("""
def foo():
    print('Hello')"""
))
print(comp('if True:'))

مما ينتج عنه

(('invalid', None), ('invalid', None), 'if')
(('complete', None), ('invalid', None), 'if\n\n')
(('complete', None), ('incomplete', 4), "\ndef foo():\n    print('Hello')")
(('incomplete', 4), ('incomplete', 4), 'if True:')

ترى أن العنصر الثالث هو العنصر الذي يهمنا. والثاني كان بدافع الفضول حيث أن إحدى "ميزات" IPython هي فرض التنفيذ إذا كان هناك أكثر من سطرين جديدين.

جزء من الكود ذي الصلة موجود في الاختصار .

أعتقد أن هناك نوعًا من الخلط بين دور تحديد ما إذا كان التحقق من الشفرة "مكتملاً" ، أو ما إذا كان ينبغي "تنفيذ أو إضافة سطر جديد".

أظن أن الاستدلال الذي يتحقق مما إذا كان الإدخال متعدد الأسطر وما إذا كان الحرف الأخير سطرًا جديدًا بالفعل أم لا يجب أن يكون كافياً.

أحد الأسئلة المتبقية هو مكان وضع هذا الإصلاح؟

  • في shortcut.py ؟ إذا كان الأمر كذلك ، فسيتم إصلاح محطة IPython فقط
  • في input_transformer2؟ أعتقد أن هذا قد يكون الحل الصحيح مثل هذا ولكن من المحتمل أن يؤثر أيضًا على QtConsole.

اسمحوا لي أن أعرف ما إذا كان هذا كافيا لتبدأ على الأقل.

شكر !

مرحبا Carreau ! شكرا جزيلا على الشرح التفصيلي وحالات الاختبار.

لقد تمكنت من إعادة إنتاجه محليًا باستخدام إصدار dev من ipython وسأبدأ الآن في البحث في الكود لـ shortcut.py و inputtransformer .

هل تمانع في إعطائي بعض الأمثلة (العمل وليس العمل) لما تتوقعه ، من أجل تقديم اختبار للإصلاحات؟

لا تحتاج إلى بعض الأمثلة. يحدث الخطأ بطريقة قابلة للتكرار للغاية.
يعمل خط متعدد الأسطر فقط إذا انتهى الخط بنقطتين. إذا لم يكن هناك نقطتان في نهاية السطر ، فسيقوم iPython بتنفيذ الكود. يبدو هذا تافهًا إلى حد ما مع هذه المعلومات ولكن لم ينظر أبدًا في شفرة مصدر iPython ، لذلك ربما أنا متفائل جدًا هنا ؛)

iPython

الحالة العلوية من فضلك ، لا نريد مشكلة مع التفاح.

لا تحتاج إلى بعض الأمثلة

حسنًا ، لا ، لست بحاجة إلى ذلك ، لكني أريد أمثلة متعددة. يمكنني التكاثر والحصول على فكرة عن كيفية إصلاحها ، ولكن وجود عدة حالات تساعدني في التأكد من أنني لا أتعرض لحالة متطرفة. لدي وجهة نظر متحيزة حول كيفية استخدام IPython ، لذا فإن الأمثلة من الآخرين مفيدة.

iPython
الحالة العلوية من فضلك ، لا نريد مشكلة مع التفاح.

على الأقل اكتشفت سبب وجود الجزء العلوي في الاسم ، شكرًا وآسف :)

كاعتذار ، إليك طلب سحب رقم 11354 يعمل على إصلاح هذه المشكلة (الرئيسية). IMHO هذا خطأ حظر لـ IPython ، يجب أن تفكر في إصدار إصدار قريبًا (انظر عدد المشكلات التي تم إنشاؤها في github بواسطة المستخدمين بخصوص ذلك).

على الأقل اكتشفت سبب وجود الجزء العلوي في الاسم ، شكرًا وآسف :)

هذا ليس السبب (الوحيد) ، حيث تم إصدار IPython 0.1 قبل أول منتج iProduct ، ولكن عادة ما يتذكره الناس

كاعتذار ، إليك طلب سحب رقم 11354 يعمل على إصلاح هذه المشكلة (الرئيسية).

شكرا سآخذ نظرة عندما يسمح الوقت

يجب أن تفكر في إصدار إصدار قريبًا

نعم ، بمجرد أن يتوفر للمتطوع الوقت ، سنقوم بذلك. هناك مشكلة حرجة أخرى مثل الحصول على إصدار jupyter_console ، ولا أعتقد أن أي شخص هنا يمكن أن يستغرق بضع ساعات في DAYJOB $ للقيام بذلك. لذلك قد تضطر إلى الانتظار حتى نهاية الأسبوع.

في الواقع ، حصلت على تراجع مع الإصلاح. إصلاحه الآن.

في الواقع ، حصلت على تراجع مع الإصلاح. إصلاحه الآن.

تم تحديث PR # 11354 الآن.

شكرًا على الإصلاح ، هل لديك أي فكرة متى سيتم إصدار هذا؟ أنا أستخدم روابط مفاتيح vim لـ CTRL-O لا تعمل بالنسبة لي (ESC + o لا ...)

شكرًا على الإصلاح ، هل لديك أي فكرة متى سيتم إصدار هذا؟

سيكون أحد المتطوعين في المشروع يحصل على بضع ساعات مجانية لفرز المشكلات القليلة المتبقية لـ 7.1 ويقوم بالإصدار. آمل أن أحصل على بضع ساعات في نهاية هذا الأسبوع ، لكن هذا قد لا يكون كافيًا.

أي مساعدة في فرز / مراجعة / وضع علامات على العلاقات العامة / القضايا الحالية ستكون مفيدة.

لا يزال قابلاً للتكرار مع الكتل async with ، جرب كل من الفرع الرئيسي الحالي و v7.1.1 من PyPI.

In [16]: async with aiofiles.open('/tmp/foobar', 'r') as f:
    ...:     content = await f.read()

In [17]: content
Out[17]: 'hello'

همهمة ، من المحتمل أن يكون هذا تفاعلًا غريبًا مع autoawait

أوه ، لم أعتقد أنه سيرتبط بهذه المشكلة. على أي حال ، سبب فشلها هو أنه عندما يكون لدينا

async with aiohttp.ClientSession() as session:
    pass|   # < cursor is there

يتم تشغيله check_complete على كل سطر ينتهي ، والذي بدوره ينفذ compile_command ، ويقوم الأخير برفع SyntaxError لأنه يتم استخدام "غير متزامن مع" خارج الدالة غير المتزامن .
في مفترقتي ، قمت للتو بكتم صوت SyntaxError لكنها بالتأكيد ليست الطريقة الأكثر ذكاءً لإصلاح ذلك ، lol.

الحلول / الأفكار الممكنة:

  • يجب التحقق من تشغيل autoawait . إذا كان الأمر كذلك ، يمكن تجاهل حالة SyntaxError . لا أعتقد أنه حل جيد ، لكن ربما أبالغ في تعقيد الأمور.

  • إذا كان autoawait قيد التشغيل ، فقم بتغذية compile_command() مع الكود ملفوفًا بـ _asyncify() . أعتقد ، بهذه الطريقة لن يرفع SyntaxError ، لكنني لست متأكدًا مما إذا كان سيتم حل مشكلة السطر الجديد لأن _asyncify() نفسه يضيف بعض مستويات المسافة البادئة ويمكن أن يحدث فوضى بسهولة.

  • ربما _AsyncSyntaxErrorVisitor يمكن أن تساعد أي شيء؟ لكن أعتقد أنه من أجل العكس

أنا آسف لقلة التفاني ، سأقدم للعلاقات العامة ، لكنني أكره كتابة الاختبارات وما إلى ذلك ، ولست متأكدًا أيضًا من أفضل طريقة لإصلاح ذلك. لكن آمل أن يكون مفيدًا لشخص ما.

يمكننا تجربة شيء مثل هذا أيضًا.

هذه هي نقطتك رقم 2 ، وهي بالفعل قبيحة. الخط الجديد يعمل. ما سيكون جيدًا هو الحصول على الدعم المناسب في CPython.

هل هذه المشكلة لا تزال دون حل؟ أعتقد أنني ربما تكون قد التقطت هذا الخطأ ...

يأتي هذا اليوم لأول مرة (خلال عرض توضيحي مع عميل عندما كنت أحاول توضيح ماهية المولد في Python !!!).

هل أفعل شيئًا خاطئًا أو ما الذي يفترض بي فعله لكتابة كتل التعليمات البرمجية متعددة الأسطر (بخلاف الحل البديل CTRL-o)؟

النتيجة المتوقعة كما هو موضح في Python REPL القياسي:

(tsa) BillsMacBookPro:develop billtubbs$ python
Python 3.5.5 | packaged by conda-forge | (default, Jul 23 2018, 23:45:11) 
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in range(5):
...     x = i*2
...     print(x)
... 
0
2
4
6
8
>>> exit()

النتيجة اليوم عندما أكتب نفس الشيء في iPython REPL:

(tsa) BillsMacBookPro:develop billtubbs$ ipython
Python 3.5.5 | packaged by conda-forge | (default, Jul 23 2018, 23:45:11) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: for i in range(5): 
   ...:     x = i*2                                                                   

In [2]:      

يقوم iPython REPL تلقائيًا بوضع مسافة بادئة للسطر الثاني كما هو متوقع. ولكن عندما أكتب إدخال في نهاية السطر الثاني ، يتم تنفيذ السطرين بدلاً من توفير سطر ثالث اختياري.

كما هو موضح أعلاه ، يمكنني الحصول على النتيجة المرجوة بالضغط على CTRL-o بدلاً من الضغط على مفتاح الإدخال في السطر الثاني:

In [2]: for i in range(5): 
   ...:     x = i*2 
   ...:     print(x)                                                                  
0
2
4
6
8

IPython 7.0.1 - ...

الرجاء ترقية IPython الخاص بك ، تم حل هذه المشكلة ، لا تزال هناك حالة حافة برمز غير متزامن.

أه آسف. أعتقدت بأنني فعلت. بعد conda update ipython أحصل على # All requested packages already installed.

آسف ، أنا مرتبك قليلاً. ما هو أحدث إصدار وكيف أقوم بالترقية إليه؟

سيعتمد ذلك على كيفية تثبيته ، أقترح المحاولة باستخدام pip install لمعرفة ما إذا كان هذا يعمل. لكنك قد تعمل أيضًا في بيئة.

عندما تحدث أشياء من هذا القبيل ، أحاول إلغاء التثبيت بقوة حتى لا يمكنني تشغيل IPython ثم إعادة التثبيت.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات