可以用 Python 寫只暴露乙個 function 的模組嗎?

時間 2021-05-30 12:56:54

1樓:

如果你是問在 module 中定義多個函式並選擇性地暴露其中乙個的話,答案是「嚴格來說不可以」。你可以用單下劃線來定義 module 的私有成員,從而防止它們被自動匯入:

#file 'test.py'

deffoo

():print

'foo'

def_bar

():print

'_bar'

此時 from test import * 只會匯入 foo,而 import test 只會匯入 test.foo 。但是你仍舊無法阻止別人顯式地 from test import _bar 。

詳細原因參見 乙個 Pythonic 的類應不應該在 __init__ 中檢查引數有效性? 中的答案。

又或者你可以只在 module 裡定義單一乙個函式,所需其他函式均在此類中定義。

#file 'test.py'

deffoo

():def

bar():

print

'bar in foo'

bar()

又或者既然 class 可以寫成 callable 的,那也可以當作函式用:

#file 'test.py'

defFoo

(object

):def

__call__

(self

):print

"foo"

#__main__:

>>> from test import *

>>> f = Foo()

>>> f()

fooPython 裡面 module 不能成為 callabe object,所以如果要讓 module 能當函式用,必須自己去改被 import 進去的 namespace 的模組列表:

#test.py

import

sysdef

foo():

print

"foo"

sys.

modules

[__name__]=

foo#__main__:

>>> import test

>>> test()

foo這樣做太過 hacky,請不要這樣做。

當然還有更 hacky 的方法:CPython 判斷某 object 是否 callable,是檢視其型別之 _typeobject 成員的 tp_call 函式指標是否為 NULL(見 cpython: 8d4cace71113 Objects/abstract.

c )。那麼就可以利用 ctypes 級別修改 module 依賴的 PyTypeObject,使其 tp_call 指標指向有意義的函式,從而讓 module 也變得 callable,詳見 http://www.

slideshare.net/r1chardj

0n3s/dont-do-this-24000445

第70頁開始的內容。但是也請不要這樣做。

用python寫乙個函式,可以判斷兩個陣列是否環型相等。跪拜大佬幫忙解答一下?

薛衣人 defequal arr1 arr2 if arr1 isNone or arr2 isNone return False count1 arr1 count x forxin sorted set arr1 count2 arr2 count x forxin sorted set arr...

可以用一句話寫乙個悲傷的故事嗎?

聽潮 去看大聖歸來,旁邊有個小孩兒問他媽媽 這個不是動畫片麼?為什麼有這麼多大人來看?他媽媽回答 因為他們一直在等大聖歸來啊,等啊等啊,就長大了. 我來講個故事啊。乙個剛做完雙側股骨頭置換手術的60來歲的病人在醫院陪護另乙個60多歲馬上要做胰腺癌手術的病人。這兩個人乙個是我媽,乙個是我爸。 花花 真...

兩隻貓可以用乙個貓砂盆,水盆,飯盆嗎?

簡單點兒 我家兩隻貓,大貓是公公,十個月,小貓是妹妹,五個月。小貓乙個半月時帶回家的,那時大貓還沒經歷喵生中最重要的手術。它們倆共用貓砂盆 水盆和飯盆。主要原因嘛,我覺得還是因為大貓性格好。就連它那麼愛吃的肉肉,都會剩下最後一兩口給小貓吃,從沒跟它搶過。我家大貓簡直是個寶藏貓咪。 西門不吹雪 看兩隻...