Ipython: إتمام علامات التبويب للمسارات المعطلة مرة أخرى في 7.2.0

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

يبدو أن إكمال علامة التبويب للمسارات داخل السلاسل قد تعطل مرة أخرى (تمت الإشارة إليه سابقًا في العديد من الأماكن ، مثل # 10961 ، # 10996 ، مشكلة دفتر الملاحظات # 3333 ). هذا ما أحصل عليه بـ v7.2.0 :

screen shot 2018-12-14 at 12 39 17 pm

مقارنة بالسلوك في v7.1.1 :

screen shot 2018-12-14 at 12 38 20 pm

من المحتمل أنه مرتبط بـ # 11503 ، حيث أن تعطيل Jedi (إعداد c.IPCompleter.use_jedi = False في ipython_config.py ) يعطي السلوك الصحيح.

معلومات النظام

{'commit_hash': '523ed2fe5',
 'commit_source': 'installation',
 'default_encoding': 'UTF-8',
 'ipython_path': '/usr/local/lib/python3.6/site-packages/IPython',
 'ipython_version': '7.2.0',
 'os_name': 'posix',
 'platform': 'Darwin-17.7.0-x86_64-i386-64bit',
 'sys_executable': '/usr/local/opt/python/bin/python3.6',
 'sys_platform': 'darwin',
 'sys_version': '3.6.5 (default, Jun 17 2018, 12:13:06) \n'
                '[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]'}

help wanted tab-completion

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

يبدو أن الرجوع إلى إصدار أقدم من ipython == 7.1.1 يعمل كإصلاح بالنسبة لي.

ال 32 كومينتر

لدي نفس المشكلة ، ipython 7.2.0.

يبدو أن الرجوع إلى إصدار أقدم من ipython == 7.1.1 يعمل كإصلاح بالنسبة لي.

هل يمكن لشخص ما المشاركة إذا كان تمكين jedi ساعد في سير العمل ، وإذا كان الأمر كذلك ، أود أن أعرف كيف؟

لقد جعلت حياتي أكثر صعوبة بالتأكيد: لا يوجد إكمال متعدد المستويات ، ولا إكمال للمجلد ، ولا يمكنني استخدام الإكمال التلقائي قبل تشغيل الخلية (فشل df = pd.DataFrame(); df.val<TAB> )

من المؤكد أن هذا الخطأ جعل حياتي أكثر صعوبة أيضًا.

ربما يكون الإكمال التلقائي أحد أهم ميزات الغلاف التفاعلي. هل هناك طريقة يمكن أن يتعايش بها Jedi والإكمال التلقائي للمسار؟
ستساعد بعض الأساليب التجريبية البسيطة جدًا في اتخاذ قرار باستخدام jedi أو إكمال الإرث كثيرًا: إذا كان أحدهم في سلسلة ، فمن غير المرجح أن يرغب المرء في أسماء من مساحة الاسم الحالية.

بالنسبة لأولئك الذين واجهوا مشكلات مع الرجوع إلى إصدار أقدم ، وجدت أن تعليق jedi الإكمال التلقائي في تكوين ipython. إذا لم تكن قد قمت بذلك بالفعل ، يمكنك إنشاء ipython_config.py باستخدام:

# Generate config
ipython profile create
# Edit config file in vim
vim .ipython/profile_default/ipython_kernel_config.py 

وتغيير c.IPCompleter.use_jedi = False في ipython_config.py

[مكمل jedi] جعل حياتي أكثر صعوبة بالتأكيد: لا إكمال متعدد المستويات ، لا استكمال للمجلد ، [...]

لا لا لا. ليس المكمل الجيدى هو الذى يفعل ذلك. هناك العديد من المكملين وأنت تصف أنه تم تحديد المكمل الخطأ لأن كود التحديد الكامل معطل. ولمس قائمة المكملات بتمكين jedi كشف هذا الخطأ. يصف takluyver المشكلة في https://github.com/ipython/ipython/pull/10996#issuecomment -378288569.

يعد تعطيل jedi مرة أخرى حلاً مؤقتًا ، لكن إصلاح رمز التحديد الكامل (# 11064 على ما أعتقد) سيكون بالطبع حلاً أفضل بكثير.

ما أفهمه هو أن جميع المكملات تعمل في نفس الوقت. يتم تعريف المكملات هنا ، ويتم استخدامها جميعًا في نفس الوقت . ستحتوي قائمة matches (نتيجة الإكمال التلقائي) على تسلسل جميع نتائج المكملات ، ولا يزال file_matches جزءًا منها.

لذا فإن إكمال اسم المسار / الملف ليس "معطلاً" عند تمكين jedi ، إنه فقط أن هناك العديد من النتائج (قادمة من jedi) بحيث لا يمكنك رؤية مسار ملفك مطابقًا بعد الآن.

ستكون فكرتي الأولى للإصلاح هي تعطيل الإكمال التلقائي لـ Jedi عند كتابة سلسلة؟ هل هذا العمل؟
الشيء الوحيد الذي لن يعمل هو الإكمال التلقائي عند تنفيذ التعليمات البرمجية باستخدام eval أو exec ، لكنني أعتقد أننا لا نستطيع إصلاح كل حالة استخدام. ويبدو أن بعض الأشخاص يحبون الإكمال التلقائي لمسار الملف.

تحرير: عند قراءة المشكلة الأخرى التي ربطتها بـ @ fly-sheep # 11064 ، أفهم أن هناك بالفعل منطقًا لعدم استخدام jedi عند الكتابة في سلسلة ، لكنها معطلة؟

فقط لتوضيح ما أقوله. تم التقاط كلتا اللقطتين باستخدام jedi ، وترى أن الإكمال التلقائي للمسار لا يزال يعمل ، ما عليك سوى كتابة المزيد قليلاً لأن هناك المزيد من التطابقات.
test1
test2

هذه هي مشكلتي بشكل عام: تساعد الكتابة قليلاً ، لكنها ليست دائمًا خيارًا إذا كنت لا تعرف الحرف الأول من الملف. حتى لو بدأت بوضوح في كتابة المسار ، فبعد كل "/" يقوم المُكمل "بإعادة التعيين" إلى الوضع الافتراضي لإظهار القيمة المطلقة () وكل () والمكونات الأخرى.
image

إنها مشكلة كبيرة إذا كان لديك مسارات طويلة مع عدد قليل من المجلدات المتداخلة. سيؤدي الإكمال التلقائي لـ Bash فقط إلى إضافة أشياء على "علامة التبويب". باستخدام الإكمال التلقائي الحالي لـ ipython ، عليك أن تتذكر الحرف الأول أو القليل من كل مجلد / ملف ، واكتبه ، ثم استمر في التنقل حول بعض العناصر المدمجة قبل العثور على الملف / المجلد.

إذا كانت هناك طريقة لإزالة جميع البنيات من الإكمال التلقائي ، وكل سحر ipython - فسيكون بالفعل أفضل بكثير!

أعرف كيفية كتابة "abs" ، ويمكن لمعظمنا كتابته عدة مرات أسرع من تحديده من قائمة الإكمال التلقائي. لست متأكدًا من وجود سبب وجيه لذلك ، و 3 إلى 4 أحرف أخرى طويلة ، لتكون هناك في المقام الأول! من الناحية المثالية ، إذا كانت هناك طريقة لتعديل قائمة العناصر المدمجة ، فسأترك بعض الأسماء الطويلة التي أستخدمها ، مثل DepercationWarning ، والتخلص من كل شيء آخر.

انظر فقط إلى حالة الاستخدام في الصورة: لماذا أرغب في كتابة اسم كائن Python داخل سلسلة حرفية؟

يمكنني العثور على حالة استخدام بسيطة:

exec("print(abs(-3))", [globals()])

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

نعم ، إنه احتمال ، ويعتمد بعض الأشخاص على exec كثيرًا.

من الناحية المثالية ، يجب أن يكتشف الإكمال التلقائي أنه في وضع اسم الملف ، ومن هناك وظيفة مثل إكمال علامة تبويب bash العادي. يبدأ الوكيل الجيد بـ "/" أو "./" أو "C:" "D:" إلخ.

من غير المحتمل أن تحتوي السلسلة التي تبدأ بهذه المتغيرات على تعبيرات بيثون صالحة.

أنا متأكد من أنه يمكن للمرء أن يصنع مثالًا على a = "C:print(abs(-3))"; exec(a[2:]) لكن هذا غير محتمل.

نعم ، في الواقع ، من المفترض أن يتخطى الرمز إكمال jedi عندما تكتب سلسلة. انظر هذا السطر: https://github.com/ipython/ipython/blob/65778adec13a65f82c5d2bab123e7a63516702c8/IPython/core/completer.py#L1375
وهو يعتمد على منطق التحليل الداخلي لجيدي لمحاولة معرفة ما إذا كنا في سلسلة أم لا.
لقد اختبرت هذا الرمز قليلاً واتضح أنه معطل بعض الشيء ، على سبيل المثال عند كتابة path = " سترى أنك في سلسلة ، ولكن ليس مع path = "./ . أعتقد أنه يمكننا التوصل إلى حل أفضل باستخدام الرمز المميز .

هل يرجع ذلك إلى أن Jedi لا يعتقد أنها ورقة خطأ ، أم أن الرجوع للخلف من خلال عقدتين غير كافٍ؟

لست متأكدًا ، وسرعان ما غيرت رأيي إلى tokenize لأنني لم أحب حقيقة أنه يعتمد على عناصر jedi الداخلية (واجهة برمجة التطبيقات الخاصة).

tokenize لديه مشكلته أيضًا. ماذا لو رفعت الخلية خطأ مسافة بادئة أو خطأ نحوي قبل فتح السلسلة؟

قد تحتاج إلى التراجع عن الأسطر تدريجيًا ، ولكنك تتوقع دائمًا خطأ بالقرب من المؤشر بسبب إعلان السلسلة غير المكتمل؟

باستخدام tokenize ، أفكر في منطق بسيط كما هو الحال في inputtransformer2.py . هناك بعض المنطق لمعرفة ما إذا كان المستخدم يكتب قائمة أو قاموسًا في الجهاز ، لذلك عند الضغط على enter لا تقوم بتنفيذ الكود ، فإنك تضع سطرًا جديدًا:
test1
test2
ربما يمكننا تجربة شيء معادل مع الأحرف " و ' (يمكنني محاولة الخروج بعلاقات عامة).

يمكن أيضًا أن تكون فكرة أخرى هي استخدام regexp ، سأكون عديم الفائدة في هذه الحالة على الرغم من: P

tokenize لديه مشكلته أيضًا. ماذا لو رفعت الخلية خطأ مسافة بادئة أو خطأ في بناء الجملة قبل فتح السلسلة

أعتقد أنه لن يكتمل ... ما هو السلوك الحالي؟ هل يستمر الإكمال التلقائي في العمل عندما يكون لديك خطأ في بناء الجملة في التعليمات البرمجية الخاصة بك؟ يجب علينا التحقق

نفس المشكلة بعد التحديث إلى 7.3.0.

نعم إنه يعمل عندما يكون لديك خطأ نحوي.

Screenshot from 2019-03-28 10-48-20

يعتبر IIRC tokenize قويًا إلى حد ما فيما يتعلق بأخطاء بناء الجملة - لا يزال من الممكن ترميز نوع المقتطف الذي تعرضه بشكل جيد ، ولن يظهر الخطأ إلا عندما تحاول فهم الرموز المميزة.

لست متأكدًا مما سيفعله بشيء مثل سلسلة غير منتهية في السطر السابق ، والتي قد تكون خطأ في بناء الجملة على مستوى الرمز المميز

مشكلات مماثلة مع أحدث تثبيت لـ conda:

python                    3.7.3
ipykernel                 5.1.0              
ipython                   7.4.0           

أنا في الواقع لا أحصل على علامة تبويب كاملة على الإطلاق. أحصل على إكمال docstring فقط داخل دالة (shift + علامة تبويب مزدوجة). لا توجد طريقة إكمال على الكائنات على الإطلاق. تعمل كتابة المسارات داخل السلاسل كما هو متوقع ، أي لا توجد متغيرات عامة مدرجة.

تظل المشكلة في IPython 7.7.0 مثبتًا عبر conda:

ipython                   7.7.0            py37h5ca1d4c_0    conda-forge
ipython_genutils          0.2.0                      py_1    conda-forge
jedi                      0.14.1                   py37_0    conda-forge
python                    3.7.3                h33d41f4_1    conda-forge

وسيظل كذلك حتى يتم إغلاق هذا الإصدار و # 10926. قدمنا أنا و أدوات مطابقة IPython تعرض نتائج بينما يجب علينا إما أ) تشغيل العناصر ذات الصلة فقط أو ب) إضافة رمز إلى المطابقات التي تجعل لا يُرجعون شيئًا عندما تكون نتائجهم غير ذات صلة.

شكرًا على محاولتك المساعدة ، لكنني أعتقد أنه من الأفضل قراءة # 10926 ، الغوص في الشفرة ومعرفة كيفية تحسين الموقف بدلاً من قول "ما زالت مشكلة".

مطلوب مساعدة علامة

meeseeksdev علامة التبويب إكمال

بالنسبة لأولئك الذين واجهوا مشكلات مع الرجوع إلى إصدار أقدم ، وجدت أن تعليق jedi الإكمال التلقائي في تكوين ipython. إذا لم تكن قد قمت بذلك بالفعل ، يمكنك إنشاء ipython_config.py باستخدام:

# Generate config
ipython profile create
# Edit config file in vim
vim .ipython/profile_default/ipython_kernel_config.py 

وتغيير c.IPCompleter.use_jedi = False في ipython_config.py

أي ملف تريد تحريره؟ ipython_kernel_config.py أو ipython_config.py ؟

الحل المؤقت لهذه المشكلة هو إلحاق شرطة مائلة ثانية بعد الضغط على علامة التبويب.

بعد كتابة '/<TAB>
image

بعد كتابة /
image

بمجرد تحديد عنصر ، لن يكون هناك سوى شرطة مائلة واحدة كفاصل:

بعد الضغط على العودة
image

لاحظ أن إضافة الشرطة المائلة الثانية قبل الضغط على علامة التبويب لا يغير القائمة المنبثقة.

لقد قمت بالترقية إلى أحدث إصدار من ipython اعتبارًا من اليوم (7.11.0) ، ولا تزال المشكلة قائمة.

@ fly -

هذا لا يصلح تمامًا # 10926 أو هذا ، لأنه سيكون من الجيد إيقاف تشغيله (في رأيي):

  • يطابق إكمال الملف عندما يكون في سلسلة مفاتيح القاموس
  • يطابق إكمال السحر عندما يكون في أي سلسلة

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

أنا مجرد مساهم صغير بنفسي ، لكني أراهن أنهم يرغبون في المساعدة في إصلاح هذا!

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