簡體   English   中英

將python代碼拆分為單獨的文件

[英]splitting python code into separate files

我正在嘗試將常見的 python 代碼拆分為單獨的文件。

例如,我有帶有以下代碼的 svr.py。

import socket

PORT = 6060
SERVER = socket.gethostbyname(socket.gethostname())
ADDRESS = (SERVER, PORT)

__server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
__server.bind(ADDRESS)

def startServer():
   pass

startServer()

所以我想拆分成 2 個 python 文件,因為公共部分 (bcode.py) 將用於 svr.py 和 client.py

文件:bcode.py 有以下代碼

import socket

PORT = 6060
SERVER = socket.gethostbyname(socket.gethostname())
ADDRESS = (SERVER, PORT)

文件:svr.py 有以下代碼

import socket
import bcode

__server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
__server.bind(ADDRESS)

def startServer():
   pass

startServer()

根據我的理解,當我導入 bcode 時,python 解釋器會執行 bcode.py,因此它應該在內存中具有常量 PORT、SERVER 和 ADDRESS,但是當我運行 svr.py 時,我收到以下錯誤消息:

Traceback (most recent call last):
  File "C:\temp\PythonProject\svr.py", line 9, in <module>
    __server.bind(ADDRESS)
NameError: name 'ADDRESS' is not defined

Process finished with exit code 1

即使在導入 bcode 之后,似乎 ADDRESS 常量在 svr.py 上也不可用,而且我還需要在 svr.py 上添加導入套接字,我想因為我已經在 bcode.py 中導入了套接字,並且當 svr.py 導入 bcode 時,導入套接字也被帶入 svr.py。

如果您能幫助我了解在 Python 中拆分公共代碼的最佳方法,我將不勝感激。

首先,我認為將代碼拆分為模塊是一個很好的主意。 它將幫助您保持代碼干凈整潔!

然后,當您在 Python 中導入模塊時,您決定將其內容包含在哪個命名空間下。 在您的示例中,您使用了標准的導入方式,即import bcode 通過這種方法, bcode所有內容都受bcode命名空間的約束,並且必須這樣引用:

import bcode

print(bcode.ADDRESS)

這也是我推薦的方法,因為當您的文件數量和代碼行增加時,它可以保持您的命名空間干凈整潔。 這樣,使用哪個ADDRESS就毫無疑問了。

但是,還有其他方法可以導入模塊,例如通過from bcode import ADDRESS顯式導入選擇的變量。 但是,想象一下這樣做,

ADDRESS = "127.0.0.1"

from bcode import ADDRESS

print(ADDRESS) # whatever was in bcode ..

現在這可能沒問題,但閱讀您代碼的其他人可能會忽略您重寫變量或忘記哪個是什么以及最初來自何處的事實。

另一種方法允許您使用*將模塊的所有內容導入到本地命名空間下。 這個解決方案對於小腳本來說可能是可以接受的,但是,你可能會讓你未來的自己(或大學)變得非常麻煩,因為你肯定會失去對你的名字(即變量、函數、類等)的控制在)從長遠來看,

ADDRESS = "127.0.0.1"

from bcode import *

print(ADDRESS) # whatever was in bcode ..
print(PORT) # whatever was in bcode ..

我強烈建議您堅持使用第一種方法(就像您已經使用的那樣),並記住適當地引用變量。

最后一點,您還應該了解重命名命名空間/模塊的可能性。 我也不真正推薦這樣做,但它可能會派上用場,例如縮短長模塊名稱。 標准庫中一些經常使用的模塊有一些常用的縮寫,例如numpy模塊,通常只引用為np

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,5,100)
y = x**2
plt.plot(x,y)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM