Hướng dẫn python call function from same module - hàm gọi python từ cùng một mô-đun

Giả sử tôi có một hàm

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it
6 bên trong một mô -đun gọi là
func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it
7. Ở đâu đó bên trong foo.py, tôi muốn có thể gọi Bar () từ chuỗi "thanh". Làm thế nào để làm điều đó?

# filename: foo.py
import sys

def bar():
  print 'Hello, called bar()!'

if __name__ == '__main__':
  funcname = 'bar'
  # Here I should be able to call bar() from funcname

Tôi biết rằng tồn tại một số chức năng tích hợp trong Python gọi là 'getattr'. Tuy nhiên, nó yêu cầu 'đối tượng mô -đun' là tham số đầu tiên. Làm thế nào để có được 'đối tượng mô -đun' của mô -đun hiện tại?

Hướng dẫn python call function from same module - hàm gọi python từ cùng một mô-đun

S.P.

3.0541 Huy hiệu vàng18 Huy hiệu bạc17 Huy hiệu đồng1 gold badge18 silver badges17 bronze badges

Hỏi ngày 11 tháng 10 năm 2012 lúc 18:18Oct 11, 2012 at 18:18

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it
8 có lẽ dễ hiểu hơn. Nó trả về
func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it
9 của mô -đun hiện tại, vì vậy bạn có thể làm:

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it

Nếu bạn thực sự muốn đối tượng mô -đun, bạn có thể lấy nó từ

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
0 (nhưng bạn thường không cần nó):

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()

Lưu ý rằng nói chung, bạn nên tự hỏi tại sao bạn muốn làm điều này. Điều này sẽ cho phép bất kỳ chức năng nào được gọi thông qua một chuỗi - có lẽ là đầu vào của người dùng ... Điều này có thể có khả năng tác dụng phụ xấu nếu bạn vô tình cung cấp cho người dùng quyền truy cập vào các chức năng sai.

Đã trả lời ngày 11 tháng 10 năm 2012 lúc 18:19Oct 11, 2012 at 18:19

Hướng dẫn python call function from same module - hàm gọi python từ cùng một mô-đun

Mgilsonmgilsonmgilson

290K61 Huy hiệu vàng608 Huy hiệu bạc676 Huy hiệu Đồng61 gold badges608 silver badges676 bronze badges

Sử dụng một từ điển giữ cho ánh xạ các chức năng bạn muốn gọi:

if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()

Đã trả lời ngày 11 tháng 10 năm 2012 lúc 18:20Oct 11, 2012 at 18:20

Hướng dẫn python call function from same module - hàm gọi python từ cùng một mô-đun

Ashwini Chaudharyashwini ChaudharyAshwini Chaudhary

237K56 Huy hiệu vàng449 Huy hiệu bạc498 Huy hiệu Đồng56 gold badges449 silver badges498 bronze badges

1

Trong Python, bạn có thể lưu các định nghĩa về các hàm trong một tệp được gọi là mô -đun. Có thể nhập các định nghĩa mô -đun vào tệp chương trình của bạn.

Chúng tôi có thể lưu các hàm Python của chúng tôi trong tệp riêng của chúng, đây là một mô -đun, sau đó mô -đun được nhập vào chương trình chính.

Để có sẵn mô -đun trong chương trình hiện tại, một câu lệnh nhập được sử dụng để chuyển nó sang chương trình đang chạy.

Khi các tệp riêng biệt được sử dụng để lưu trữ các chức năng, các chi tiết mã của chương trình được ẩn và mức logic cao hơn cho mã chương trình.

Lưu trữ các chức năng của bạn trong các tệp khác nhau có những lợi thế sau:

  1. Các chức năng có thể được sử dụng lại trong các chương trình khác nhau.
  2. Nó dễ dàng hơn để chia sẻ các tệp trong đó các chức năng được lưu trữ, mà không phải chia sẻ toàn bộ chương trình.
  3. Thông qua việc nhập các chức năng, người ta có thể sử dụng các thư viện chức năng mà các lập trình viên khác đã viết.

Chúng ta có thể nhập các mô -đun này theo những cách khác nhau, chẳng hạn như:

  • Nhập toàn bộ một mô -đun.
  • Nhập các chức năng cụ thể.
  • Sử dụng
    import sys.modules
    this_mod = sys.modules[__name__]
    func = getattr(this_mod,'bar')
    func()
    
    1 để cung cấp cho một hàm một bí danh.
  • Sử dụng
    import sys.modules
    this_mod = sys.modules[__name__]
    func = getattr(this_mod,'bar')
    func()
    
    1 để cung cấp cho một mô -đun một bí danh.
  • Nhập tất cả các chức năng trong một mô -đun.

Điều kiện tiên quyết

Để làm theo thông qua bài viết này, cần có sự hiểu biết rõ ràng về các mô -đun Python.

Nhập toàn bộ mô -đun

Bước đầu tiên là tạo một mô -đun, đây là một tệp có kết thúc

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
3 và chứa chương trình bạn muốn nhập vào chương trình chính của mình.

Dưới đây là một mô -đun với hàm

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
4. Đây là tệp
import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
5:

def make_bread(height, *garnish);
""" summarrize the bread we are about to make"""
print("\Making a "+ str(height) + "-inch bread with the following garnish :")
for garnish in garnishes;
print("-" + garnish)

Chúng ta có thể có một tệp riêng biệt

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
6 có thư mục lưu trữ tương tự như
import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
5. Tệp
import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
8 nhập mô -đun và gọi tệp
import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
9 hai lần.

Đây là tệp,

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
6:

import bread
 
bread.make_bread(11,'basil')
bread.make_bread(14,'garlic flakes', 'oregano', 'rolled oat flakes')

Một lệnh từ dòng

if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()
1 mở ra và copys tất cả các chức năng từ chương trình trong tệp
import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
5.

Sự trừu tượng hóa dữ liệu từ người dùng diễn ra sao cho người ta không hiểu điều gì xảy ra trong nền.

Tất cả những gì cần biết là bất kỳ chức năng nào được xác định trong

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
5 sẽ được cung cấp trong tệp
import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
8.

Chúng tôi gọi một hàm từ một mô -đun đã nhập bằng cách nhập tên mô -đun được nhập và tên hàm được phân tách bằng dấu chấm.

Kết quả của chương trình sẽ tương tự cho dù một mô -đun có được nhập hay không.

Đầu ra phải như sau:

Làm bánh mì 11 inch với đồ trang trí sau: -basil

Làm bánh mì 14 inch với các mảnh yến mạch được trang trí sau đây

Cú pháp nhập toàn bộ mô -đun:

import module_name
module_name.name_of_function()

Tất cả các chức năng trong tên mô -đun được nhập mà không có ngoại lệ.

Nhập chức năng cụ thể

Bạn cũng có thể nhập chỉ một chức năng cụ thể từ một mô -đun.

Cú pháp khi nhập một chức năng cụ thể:

from module_name import name_of_function

Nhập các chức năng cụ thể khác nhau từ một mô -đun được thực hiện bằng cách phân tách tên chức năng bằng dấu phẩy:

from module_name import first-function, second_function, third_function

Từ tệp

if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()
5, chúng tôi nhập các chức năng cụ thể mà chúng tôi đang sử dụng là:

from bread import make_bread
make_bread(11,'basil')
make_bread(14,'garlic flakes', 'oregano', 'rolled oat flakes')

Lưu ý: Bất cứ khi nào chúng tôi gọi chức năng bằng cú pháp này, chúng tôi không sử dụng ký hiệu dấu chấm vì hàm được nhập rõ ràng trong khai báo nhập. Chúng tôi chỉ gọi nó theo tên bất cứ khi nào chúng tôi cần sử dụng chức năng.

Đây là một lựa chọn tốt hơn khi bạn không bắt buộc phải nhập toàn bộ mô -đun và tất cả các chức năng giành được được sử dụng.

Đưa ra một chức năng một bí danh bằng cách sử dụng ‘như

Một bí danh được sử dụng chủ yếu khi tên hàm quá dài hoặc khi tên hàm tương tự như tên khác trong chương trình.

Nếu trong bất kỳ trường hợp nào xảy ra, chúng tôi sử dụng một bí danh là một tên thay thế tương tự như của hàm.

Cú pháp chung của việc sử dụng bí danh như được hiển thị bên dưới:

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it
0

Từ hàm

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
9, chúng tôi đưa ra bí danh
if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()
7. Chúng tôi sử dụng
if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()
8 làm tên hàm vì từ khóa đổi tên hàm thành bí danh.

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it
1

Câu lệnh nhập đổi tên tên hàm thành bí danh. Trong trường hợp này, hàm

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
9 được đổi tên thành
if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()
7.

Bất cứ khi nào chúng ta cần gọi hàm

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
9, chúng ta có thể sử dụng bí danh
if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()
7 và chương trình vẫn sẽ chạy chức năng
import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
9.

Bí danh tránh mọi sự nhầm lẫn với một chức năng khác có thể được viết trong chương trình là

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()
9.

Cung cấp cho một mô -đun một bí danh bằng cách sử dụng ‘như

Một bí danh của một mô -đun có thể được đưa ra dựa trên tên mô -đun. Cung cấp bí danh cho một mô -đun giúp gọi chức năng mô -đun mô -đun dễ dàng hơn.

Cú pháp khi cho một mô -đun một bí danh:

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it
2

Chúng ta có thể gọi

def make_bread(height, *garnish);
""" summarrize the bread we are about to make"""
print("\Making a "+ str(height) + "-inch bread with the following garnish :")
for garnish in garnishes;
print("-" + garnish)
5 chính xác hơn là
def make_bread(height, *garnish);
""" summarrize the bread we are about to make"""
print("\Making a "+ str(height) + "-inch bread with the following garnish :")
for garnish in garnishes;
print("-" + garnish)
6 như trong ví dụ dưới đây:

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it
3

Đưa ra một bí danh cho một mô -đun không thay đổi tên hàm, thay vào đó chúng giữ lại tên gốc của chúng.

Sử dụng tên bí danh cho mô -đun không chỉ ngắn gọn mà còn cho phép bạn tập trung vào tên thông tin của hàm, do đó, chuyển hướng sự chú ý của bạn từ tên của mô -đun.

Các tên chức năng này sẽ cho bạn biết chức năng làm gì, để cho phép khả năng đọc mã của bạn thay vì sử dụng tên đầy đủ của mô -đun.

Nhập tất cả các chức năng trong một mô -đun

Để nhập tất cả các chức năng trong một mô -đun, chúng tôi sử dụng Asterisk

def make_bread(height, *garnish);
""" summarrize the bread we are about to make"""
print("\Making a "+ str(height) + "-inch bread with the following garnish :")
for garnish in garnishes;
print("-" + garnish)
7 trong câu lệnh nhập. Asterisk đưa ra một lệnh rằng tất cả các chức năng nên được sao chép vào tệp chương trình.

Cú pháp nhập tất cả các chức năng trong một mô -đun như sau:

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it
4

Các chức năng có thể được gọi mà không cần sử dụng ký hiệu dấu chấm.

Trong trường hợp chúng tôi đang làm việc với các mô -đun lớn mà bạn không viết, việc sử dụng phương pháp này là không phù hợp.

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it
5

Nếu một số chức năng được lưu dưới cùng tên, mã sẽ không nhập riêng các chức năng. Thay vào đó, nó sẽ ghi đè tất cả các chức năng.

Lỗi và đầu ra bất ngờ có thể dẫn đến việc khớp tên hàm và các tên hiện có khác trong hàm.

Sự kết luận

Trong hướng dẫn trên, chúng tôi đã có thể xem xét việc nhập các chức năng và mô -đun dễ dàng như thế nào và quan trọng như thế nào.

Chúng tôi đã xem xét:

  • Nhập toàn bộ mô -đun là toàn bộ mô -đun và tất cả các thuộc tính của nó.
  • Nhập một chức năng cụ thể, khi đó là chức năng duy nhất cần thiết.
  • Sử dụng
    import sys.modules
    this_mod = sys.modules[__name__]
    func = getattr(this_mod,'bar')
    func()
    
    1 để cung cấp cho một hàm một bí danh, đó là một tên ngắn hơn hoặc đơn giản hơn cho chức năng và sử dụng để thực hiện thay đổi đó.
  • Sử dụng
    import sys.modules
    this_mod = sys.modules[__name__]
    func = getattr(this_mod,'bar')
    func()
    
    1 để cung cấp cho một mô -đun một bí danh Chúng tôi đã sử dụng bí danh để đơn giản hóa tên mô -đun hoặc làm cho nó khác biệt.
  • Nhập tất cả các chức năng trong một mô -đun, chúng tôi đã nhập tất cả các chức năng trong một mô -đun bất kể chúng có được sử dụng và chúng tôi sử dụng Asterik.

Tôi hy vọng bạn tìm thấy hướng dẫn này hữu ích!

Mã hóa hạnh phúc!


Đóng góp đánh giá ngang hàng của: Monica Masae

Làm thế nào để bạn gọi một hàm từ một mô -đun trong Python?

Bạn cần sử dụng từ khóa nhập cùng với tên mô -đun mong muốn. Khi thông dịch viên bắt gặp một câu lệnh nhập, nó sẽ nhập mô -đun vào chương trình hiện tại của bạn. Bạn có thể sử dụng các hàm bên trong một mô -đun bằng cách sử dụng toán tử DOT (.) Cùng với tên mô -đun.using a dot(.) operator along with the module name.

Làm thế nào để bạn gọi một hàm từ một mô -đun?

Bạn có thể gọi một mô -đun chức năng từ bất kỳ chương trình ABAP nào bằng cách sử dụng câu lệnh ABAP sau:.
Hàm gọi.
[Nhập F1 = A1 .... Fn = An].
[Thay đổi f1 = a1 .... fn = an].
[Bảng t1 = itab1 .... tn = itabn].
[Ngoại lệ E1 = R1 .... EN = RN].
[ERROR_MESSAGE = RE].
[Người khác = RO]] ..

Một chức năng có thể gọi một chức năng khác trong Python?

Trong Python, bất kỳ chức năng bằng văn bản nào cũng có thể được gọi bởi một hàm khác.Lưu ý rằng đây có thể là cách phá vỡ một vấn đề thanh lịch nhất thành các vấn đề nhỏ.any written function can be called by another function. Note that this could be the most elegant way of breaking a problem into chunks of small problems.

Điều gì xảy ra nếu bạn xác định hai hàm trong một mô -đun có cùng tên trong Python?

Python không hỗ trợ quá tải chức năng.Khi chúng tôi xác định nhiều hàm cùng tên, phần sau luôn ghi đè trước và do đó, trong không gian tên, sẽ luôn có một mục nhập duy nhất so với mỗi tên hàm.the later one always overrides the prior and thus, in the namespace, there will always be a single entry against each function name.