পাইথন ফাইলগুলিতে ড্যাশগুলি আমদানির চেষ্টা করার সময় কি ঠিক আছে?


149

মূলত যখন আমার কাছে অজগর ফাইল থাকে:

python-code.py

আর ব্যবহার করুন:

import (python-code)

দোভাষী আমাকে সিনট্যাক্স ত্রুটি দেয়।

কিভাবে এটি স্থাপন করব তার উপর কোনো ধারণা আছে? পাইথন ফাইলের নামে ড্যাশগুলি কি অবৈধ?

উত্তর:


167

পাইথন কোডের স্টাইল গাইড আপনার পিইপি 8 টি পরীক্ষা করা উচিত :

প্যাকেজ এবং মডিউল নাম মডিউলগুলির সংক্ষিপ্ত, সমস্ত-ছোট নাম থাকা উচিত। অধ্যয়নগুলি মডিউলটির নামে ব্যবহারযোগ্য যদি এটি পঠনযোগ্যতা উন্নত করে। পাইথন প্যাকেজগুলির ছোট, সমস্ত ছোট ছোট নাম থাকতে হবে যদিও আন্ডারস্কোর ব্যবহার নিরুত্সাহিত করা হয়েছে।

যেহেতু মডিউল নাম ফাইল করার জন্য ম্যাপ করা থাকে এবং কিছু ফাইল সিস্টেমগুলি সংবেদনশীল এবং দীর্ঘ নামগুলি কাটা হয়, তাই মডিউল নামগুলি মোটামুটি সংক্ষিপ্ত হিসাবে বেছে নেওয়া গুরুত্বপূর্ণ - এটি ইউনিক্সে সমস্যা হবে না তবে এটি একটি হতে পারে কোডটি পুরানো ম্যাক বা উইন্ডোজ সংস্করণ বা ডসগুলিতে স্থানান্তরিত হলে সমস্যা।

অন্য কথায়: আপনার ফাইলটির নামকরণ করুন :)


75
সমস্যাটির শৈলীর সাথে কোনও সম্পর্ক নেই, এটি একটি বাক্য গঠন ত্রুটি

4
নীচে প্রদর্শিত হিসাবে, এই নামের সাথে একটি ফাইল থাকা এখনও সম্ভব, সুতরাং শৈলী গাইডটি খুব প্রাসঙ্গিক।
পাওলো বার্গান্টিনো

5
আপনি স্পষ্টভাবে আমদানি রোধ করতে চাইলে পাইথন ডিরেক্টরি এবং ফাইলের নামগুলিতে হাইফেন ব্যবহার করা খুব সহায়ক হতে পারে। উদাহরণস্বরূপ (বলুন) একটি জ্যাঙ্গো প্রকল্পে, আপনার কাছে পাইথনে লিখিত স্ক্রিপ্ট থাকতে পারে যা অ্যাপ্লিকেশন হিসাবে সম্বোধনযোগ্য নয়। আপনি এগুলিকে একটি ফোল্ডারে রাখতে পারেন ops-scriptsএবং জেনে থাকুন যে এগুলি কোনও সাধারণ প্যাকেজ নেমস্পেস পদ্ধতির ব্যবহার করে আমদানি করা যায় না। বা একটি একক স্ক্রিপ্ট stop-website.pyএকই প্রভাব জন্য নামকরণ করা যেতে পারে । এর মধ্যে যে কোনও এখনও অবশ্যই runpyএবং কিছু অন্যান্য পদ্ধতির মাধ্যমে আমদানি করা যেতে পারে তবে এটি কিছু সাধারণ ত্রুটি এড়াতে সহায়তা করে।
ক্রিস জনসন

মডিউলটির নামকরণ সমস্যাযুক্ত হতে পারে, বিশেষত যদি আপনি অন্য কোনও মানের উপর নির্ভর করেন। আমার ক্ষেত্রে, আমি cgi-binফোল্ডারে পাইথন সিজিআই ফাইলগুলি ব্যবহার করছি (সেগুলিতে আনইটসেটস করা হচ্ছে), এটি বেশ আদর্শ af যদি আপনার মতো বিরল কেস না ঘটে তবে আপনার মডিউলের নিয়ন্ত্রণ থাকলে অবশ্যই আপনার মডিউলটির নতুন নাম দিন।
নিউক্লিয়ার পিওন

1
আমি সবেমাত্র আবিষ্কার করেছি যে পাইডেভ হাইফেনের সাথে ডিরেক্টরি নামের অনুমতি দেবে, তবে সেই ডিরেক্টরিতে থাকা .py ফাইলগুলিতে ক্লাস এবং / অথবা অভ্যন্তরীণ ভেরিয়েবলগুলি প্রদর্শন করবে না।
ব্যবহারকারী5920660

122

আপনার কোডে অন্য একটি বিষয় লক্ষণীয় তা হ'ল আমদানি কোনও ফাংশন নয়। তাই import(python-code)হওয়া উচিত import python-code, যা কিছু ইতিমধ্যে উল্লেখ করেছি, যেমন "আমদানি পাইথন বিয়োগ কোড" ব্যাখ্যা করা হয়, না কি উদ্দেশ্যে। যদি আপনাকে সত্যিকার অর্থে কোনও ফাইলের নামে ড্যাশ দিয়ে আমদানি করতে হয় তবে আপনি নিম্নলিখিতটি করতে পারেন:

python_code = __import__('python-code')

তবে, যেমন উপরে বর্ণিত হয়েছে, এটি সত্যই প্রস্তাবিত নয়। আপনার কিছু নিয়ন্ত্রণ করা থাকলে ফাইলের নাম পরিবর্তন করা উচিত।


@ কেভিন অডলম্যান আপনার হাইফেনেটেড ফাইলের সাথে আমদানি লিব ব্যবহারের কার্যকরী উদাহরণ রয়েছে? আমি চেষ্টা করেছিলাম এবং ব্যর্থ হয়েছি।
টম হেল

@ টমহেল Importlib.import_module ('abmodule-1') কাজ করা উচিত। যদি আপনার আমদানি_মডিউলটি কাজ না করে তবে আমি মনে করি একটি সাধারণ আমদানিও কাজ করবে না।
ইয়ান লিন

63

TLDR

ড্যাশ হয় না অবৈধ কিন্তু আপনি 3 কারণে তাদের ব্যবহার করা উচিত নয়:

  1. ড্যাশ সহ ফাইলগুলি আমদানি করার জন্য আপনার বিশেষ সিনট্যাক্সের প্রয়োজন
  2. ড্যাশ সহ কোনও মডিউল নাম আশা করে না
  3. এটি পাইথন স্টাইল গাইডের সুপারিশগুলির পরিপন্থী

ড্যাশ সহ যদি আপনার অবশ্যই কোনও ফাইলের নাম আমদানি করতে হয় তবে বিশেষ সিনট্যাক্সটি হ'ল:

module_name = __import__('module-name')

কেন আমাদের বিশেষ সিনট্যাক্সের প্রয়োজন তা জানতে আগ্রহী?

বিশেষ বাক্য গঠনটির কারণ হ'ল আপনি যখন লিখবেন import somenameআপনি শনাক্তকারী সহ একটি মডিউল অবজেক্ট তৈরি করছেন somename(যাতে আপনি পরে এটি উদাহরণস্বরূপ ব্যবহার করতে পারেন somename.funcname)। অবশ্যইmodule-name কোনও বৈধ শনাক্তকারী নয় এবং তাই বিশেষ সিনট্যাক্স যা বৈধ দেয় gives

মডিউল-নামটি বৈধ সনাক্তকারী নয় কেন আপনি পাবেন না?

চিন্তা করবেন না - আমিও করিনি। এখানে একটি ডগা আপনাকে সাহায্য করার জন্য আছে: এই পাইথন লাইন তাকান: x=var1-var2। আপনি কি অ্যাসাইনমেন্টের ডানদিকে বিয়োগ বা একটি ড্যাশ সহ একটি পরিবর্তনশীল নাম দেখতে পাচ্ছেন?

পুনশ্চ

আমি এক জায়গায় অন্য সমস্ত উত্তর থেকে তথ্যের সর্বাধিক প্রাসঙ্গিক বিট হিসাবে বিবেচিত যা ব্যতীত আমার উত্তরে আসল কিছুই নয়


আমি এই হাইপেন সহ একটি পাইপ প্যাকেজটি আমদানি করার চেষ্টা করছি। psycopg2_binary = import_module('psycopg2-binary')। ত্রুটি => ModuleNotFoundError: No module named 'psycopg2-binary'। তবে psycopg2-binaryইনস্টল করা আছে। কীভাবে এটি অন্তর্ভুক্ত করবেন সে সম্পর্কে কোনও ধারণা নেই।
মোড় জার্ট

সম্ভবত এটি কোনও পথের সমস্যা। এ লুক chrisyeh96.github.io/2017/08/08/...
ndemou

32

সমস্যাটি হ'ল এটি python-codeকোনও সনাক্তকারী নয়। পার্সার এটিকে pythonবিয়োগ হিসাবে দেখবে code। অবশ্যই আপনি যা জিজ্ঞাসা করছেন এটি তা করবে না। আপনাকে এমন একটি ফাইল নাম ব্যবহার করতে হবে যা একটি বৈধ অজগর সনাক্তকারীও। -একটি আন্ডারস্কোর দিয়ে প্রতিস্থাপন চেষ্টা করুন ।


4
+1 টি। পাইথন উত্স কোডের ফাইলের নামটি একটি বৈধ সনাক্তকারী হওয়া উচিত বলে কখনও ভাবেননি, কারণ ফাইলটির নামটি মডিউল অবজেক্টটি উল্লেখ করতে ব্যবহৃত হবে।
অ্যান্ডি

5

আপনি সম্ভবত এটি কিছু __import__হ্যাকের মাধ্যমে আমদানি করতে পারেন, তবে আপনি যদি ইতিমধ্যে এটি না জানেন তবে আপনার উচিত নয়। পাইথন মডিউলের নামগুলি বৈধ পরিবর্তনশীল নাম ("সনাক্তকারী") হওয়া উচিত - এর অর্থ যদি আপনার মডিউল থাকে তবে আপনি foo_barপাইথন ( print foo_bar) এর মধ্যে থেকে এটি ব্যবহার করতে পারেন । আপনি কোনও অদ্ভুত নাম ( print foo-bar-> সিনট্যাক্স ত্রুটি) দিয়ে এটি করতে সক্ষম হবেন না ।


5

পাইথন 3 এ Import_module ব্যবহার করুন :

from importlib import import_module
python_code = import_module('python-code')

আরো সাধারণভাবে,

import_module('package.subpackage.module')

1

যদিও সঠিক ফাইল নামকরণই সর্বোত্তম কোর্স, যদিও python-codeএটি আমাদের নিয়ন্ত্রণে না থাকে, হ্যাক ব্যবহার __import__করা অনুলিপি করা, নাম বদলানো বা অন্যথায় অন্য লেখকের কোডের সাথে গোলমাল করার চেয়ে ভাল। যাইহোক, আমি চেষ্টা করেছি এবং আমি .pyএক্সটেনশন যুক্ত করে ফাইলটির নাম পরিবর্তন না করে এটি কাজ করে না । কীভাবে একটি বিবরণ পাবেন সে সম্পর্কে ডকটি দেখার পরে .py, আমি এটি দিয়ে শেষ করেছি:

import imp

try:
    python_code_file = open("python-code")
    python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
    python_code_file.close()

এটি python-codecপ্রথম দৌড়ে একটি নতুন ফাইল তৈরি করেছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.