โดยทั่วไปเมื่อฉันมีไฟล์หลามเช่น:
python-code.py
และใช้:
import (python-code)
ล่ามให้ฉันข้อผิดพลาดทางไวยากรณ์
ความคิดเห็นเกี่ยวกับวิธีการแก้ไขหรือไม่ เครื่องหมายขีดคั่นผิดกฎหมายในชื่อไฟล์หลามหรือไม่
โดยทั่วไปเมื่อฉันมีไฟล์หลามเช่น:
python-code.py
และใช้:
import (python-code)
ล่ามให้ฉันข้อผิดพลาดทางไวยากรณ์
ความคิดเห็นเกี่ยวกับวิธีการแก้ไขหรือไม่ เครื่องหมายขีดคั่นผิดกฎหมายในชื่อไฟล์หลามหรือไม่
คำตอบ:
คุณควรตรวจสอบPEP 8คู่มือสไตล์สำหรับรหัส Python:
ชื่อแพ็กเกจและโมดูลโมดูลควรมีชื่อแบบย่อและตัวพิมพ์เล็กทั้งหมด สามารถใช้เครื่องหมายขีดล่างในชื่อโมดูลได้หากมีการปรับปรุงความสามารถในการอ่าน แพ็คเกจ Python ควรมีชื่อสั้นและตัวพิมพ์เล็กทั้งหมดแม้ว่าการใช้เครื่องหมายขีดล่างจะไม่ได้รับการสนับสนุน
เนื่องจากชื่อโมดูลถูกแม็พกับชื่อไฟล์และระบบไฟล์บางระบบเป็นแบบไม่คำนึงถึงขนาดตัวพิมพ์และตัดทอนชื่อยาวมันเป็นสิ่งสำคัญที่ชื่อโมดูลถูกเลือกให้สั้นพอสมควร - นี่ไม่ใช่ปัญหาสำหรับ Unix แต่อาจเป็น ปัญหาเมื่อรหัสถูกส่งไปยัง Mac หรือ Windows เวอร์ชั่นที่เก่ากว่าหรือ DOS
กล่าวอีกนัยหนึ่ง: เปลี่ยนชื่อไฟล์ของคุณ :)
ops-scripts
และรู้ว่าพวกเขาไม่สามารถนำเข้าโดยใช้วิธีการปกติของแพ็คเกจเนมสเปซ หรืออาจตั้งชื่อสคริปต์เดียวstop-website.py
เพื่อให้มีผลกระทบที่คล้ายกัน สิ่งเหล่านี้ยังคงสามารถนำเข้าผ่านrunpy
และวิธีการอื่น ๆ ได้ แต่จะช่วยหลีกเลี่ยงข้อผิดพลาดทั่วไปได้
cgi-bin
โฟลเดอร์ (ทำ unitttests กับพวกเขา) ซึ่งเป็นไฟล์มาตรฐานที่ค่อนข้างดี ยกเว้นว่าคุณมีกรณีที่หายากเช่นนี้ให้เปลี่ยนชื่อโมดูลของคุณถ้าคุณสามารถควบคุมมันได้
สิ่งอื่นที่ควรทราบในรหัสของคุณคือการนำเข้าไม่ใช่ฟังก์ชัน ดังนั้นimport(python-code)
ควรimport python-code
เป็นอย่างที่บางคนได้กล่าวถึงแล้วถูกตีความว่าเป็น "นำเข้าหลามลบรหัส" ไม่ใช่สิ่งที่คุณตั้งใจ หากคุณต้องการนำเข้าไฟล์ด้วยเส้นประในชื่อจริง ๆ คุณสามารถทำสิ่งต่อไปนี้ ::
python_code = __import__('python-code')
แต่ตามที่กล่าวไว้ข้างต้นนี้ไม่แนะนำจริงๆ คุณควรเปลี่ยนชื่อไฟล์ถ้ามันเป็นสิ่งที่คุณควบคุม
TLDR
เครื่องหมายขีดคั่นไม่ผิดกฎหมาย แต่คุณไม่ควรใช้ด้วยเหตุผล 3 ประการ:
หากคุณต้องการนำเข้าชื่อไฟล์ด้วยเส้นประแน่นอนไวยากรณ์พิเศษคือ:
module_name = __import__('module-name')
อยากรู้ว่าทำไมเราต้องมีรูปแบบพิเศษ?
เหตุผลสำหรับไวยากรณ์พิเศษคือเมื่อคุณเขียนimport somename
คุณกำลังสร้างวัตถุโมดูลที่มีตัวระบุsomename
(เพื่อให้คุณสามารถใช้ในภายหลังได้เช่นsomename.funcname
) แน่นอนmodule-name
ไม่ใช่ตัวระบุที่ถูกต้องและด้วยเหตุนี้ไวยากรณ์พิเศษที่ให้ค่าที่ถูกต้อง
คุณไม่เข้าใจว่าทำไมชื่อโมดูลไม่ใช่ตัวระบุที่ถูกต้อง
ไม่ต้องกังวล - ฉันก็ไม่ได้เช่นกัน นี่คือเคล็ดลับที่จะช่วยให้คุณ: x=var1-var2
ดูที่บรรทัดหลามนี้: คุณเห็นการลบทางด้านขวาของการมอบหมายหรือชื่อตัวแปรพร้อมกับเครื่องหมายขีดกลางหรือไม่?
PS
ไม่มีอะไรเป็นต้นฉบับในคำตอบของฉันยกเว้นรวมถึงสิ่งที่ฉันถือว่าเป็นบิตของข้อมูลที่เกี่ยวข้องมากที่สุดจากคำตอบอื่น ๆ ทั้งหมดในที่เดียว
psycopg2_binary = import_module('psycopg2-binary')
. ข้อผิดพลาด ModuleNotFoundError: No module named 'psycopg2-binary'
=> แต่psycopg2-binary
ติดตั้งแล้ว ไม่ทราบวิธีรวมไว้
ปัญหาคือpython-code
ไม่ใช่ตัวระบุ ตัวแยกวิเคราะห์เห็นว่านี่เป็นลบpython
code
แน่นอนว่าสิ่งนี้จะไม่ทำในสิ่งที่คุณขอ คุณจะต้องใช้ชื่อไฟล์ที่เป็นตัวระบุ ธ ที่ถูกต้อง ลองแทนที่-
ด้วยการขีดเส้นใต้
คุณอาจจะสามารถนำเข้ามันผ่านการ__import__
แฮ็ก แต่ถ้าคุณยังไม่รู้วิธีการคุณไม่ควรทำ ชื่อโมดูล Python ควรเป็นชื่อตัวแปรที่ถูกต้อง ("ตัวระบุ") - ซึ่งหมายความว่าหากคุณมีโมดูลfoo_bar
คุณสามารถใช้งานได้จากภายใน Python ( print foo_bar
) คุณจะไม่สามารถทำได้ด้วยชื่อแปลก ๆ ( print foo-bar
-> ข้อผิดพลาดทางไวยากรณ์)
บน Python 3 ให้ใช้import_module :
from importlib import import_module
python_code = import_module('python-code')
ให้เป็นปกติมากกว่านี้,
import_module('package.subpackage.module')
แม้ว่าการตั้งชื่อไฟล์ที่เหมาะสมเป็นวิธีที่ดีที่สุดหาก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
ในการเรียกใช้ครั้งแรก