Saya ingin menunjukkan fungsi yang tidak melakukan apa-apa:
def identity(*args)
return args
kasus penggunaan saya adalah sesuatu seperti ini
try:
gettext.find(...)
...
_ = gettext.gettext
else:
_ = identity
Tentu saja, saya bisa menggunakan yang identity
didefinisikan di atas, tetapi built-in pasti akan berjalan lebih cepat (dan menghindari bug yang diperkenalkan oleh saya sendiri).
Tampaknya, map
dan filter
digunakan None
untuk identitas, tetapi ini khusus untuk implementasi mereka.
>>> _=None
>>> _("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
map and filter use None for the identity
?map(None, [1, 2, 3])
Jawaban:
Melakukan penelitian lebih lanjut, tidak ada, fitur ditanya dalam edisi 1673203 Dan dari Raymond Hettinger mengatakan tidak akan ada :
Jadi cara yang lebih baik untuk melakukannya sebenarnya adalah (lambda menghindari penamaan fungsi):
ATAU
sumber
lambda x: x
fungsi identitas sepele yang berfungsi untuk satu parameter string. @ Marscin Saya berharap saya bisa melakukanlambda *args: *args
:-)Fungsi identitas, sebagaimana didefinisikan dalam https://en.wikipedia.org/wiki/Identity_function , mengambil satu argumen dan mengembalikannya tidak berubah:
Apa yang Anda minta ketika Anda mengatakan Anda ingin tanda tangan
def identity(*args)
itu bukan semata-mata fungsi identitas, karena Anda ingin mengambil beberapa argumen. Itu bagus, tapi kemudian Anda menemukan masalah karena fungsi Python tidak mengembalikan banyak hasil, jadi Anda harus menemukan cara untuk menjejalkan semua argumen itu menjadi satu nilai balik.Cara biasa mengembalikan "nilai ganda" dengan Python adalah dengan mengembalikan tupel nilai - secara teknis itu adalah satu nilai balik tetapi dapat digunakan dalam sebagian besar konteks seolah-olah nilai ganda. Tetapi melakukan itu di sini berarti Anda mendapatkannya
Dan memperbaiki yang masalah cepat memberikan isu-isu lain, seperti berbagai jawaban di sini telah menunjukkan.
Jadi, secara ringkas, tidak ada fungsi identitas yang didefinisikan dalam Python karena:
Untuk kasus Anda yang tepat,
hampir pasti apa yang Anda inginkan - fungsi yang memiliki konvensi pemanggilan dan pengembalian yang sama dengan
gettext.gettext
, yang mengembalikan argumennya tidak berubah, dan secara jelas dinamai untuk menggambarkan apa yang dilakukannya dan di mana ia dimaksudkan untuk digunakan. Saya akan sangat terkejut jika kinerja menjadi pertimbangan penting di sini.sumber
id= lambda *args: args if len(args)>1 else args[0]
.milikmu akan bekerja dengan baik. Ketika jumlah parameter diperbaiki, Anda dapat menggunakan fungsi anonim seperti ini:
sumber
lambda *args: args
. Ini benar-benar pilihan gaya.*args
versi ini memiliki tipe pengembalian yang berbeda, sehingga tidak setara bahkan untuk kasus argumen tunggal.def
danlambda
untuk fungsi-fungsi sederhana tersebut.Tidak ada fungsi identitas bawaan di Python. Tiruan dari Haskell
id
fungsi akan menjadi:Contoh penggunaan:
Karena
identity
tidak melakukan apa pun kecuali mengembalikan argumen yang diberikan, saya tidak berpikir bahwa itu lebih lambat daripada implementasi asli.sumber
Tidak, tidak ada.
Perhatikan bahwa Anda
identity
:Akan kotak argumennya - yaitu
Jadi, Anda mungkin ingin menggunakan
lambda arg: arg
jika Anda ingin fungsi identitas yang sebenarnya.NB: Contoh ini akan membayangi
id
fungsi bawaan (yang mungkin tidak akan Anda gunakan).sumber
id
Jika kecepatan tidak masalah, ini harus menangani semua kasus:
Contoh penggunaan:
sumber
Rintisan fungsi argumen tunggal
gettext.gettext
(contoh penggunaan OP kasus) menerima satu argumenmessage
,. Jika seseorang membutuhkan sebuah rintisan untuk itu, tidak ada alasan untuk kembali[message]
daripadamessage
(def identity(*args): return args
). Demikian keduanyapas sekali.
Bug dalam kasus sepele seperti itu hampir tidak relevan. Untuk argumen tipe standar, katakanlah
str
, kita dapat menggunakanstr()
dirinya sebagai fungsi identitas (karena string yang menggunakannya bahkan mempertahankan identitas objek, lihatid
catatan di bawah) dan membandingkan kinerjanya dengan solusi lambda:Optimalisasi mikro dimungkinkan. Misalnya, kode Cython berikut :
test.pyx
Kemudian:
Fungsi identitas objek bawaan
Jangan bingung fungsi identitas dengan
id
fungsi bawaan yang mengembalikan 'identitas' suatu objek (yang berarti pengidentifikasi unik untuk objek tertentu daripada nilai objek itu, dibandingkan dengan==
operator), alamat memorinya dalam CPython.sumber
Utasnya cukup lama. Tapi tetap ingin memposting ini.
Dimungkinkan untuk membangun metode identitas untuk argumen dan objek. Dalam contoh di bawah ini, ObjOut adalah identitas untuk ObjIn. Semua contoh lain di atas belum membahas dikt ** kwargs.
sumber
map(identity, [1, 2, 3])
kembali[1, 2, 3]
?class test1(object): def __init__(self,*args,**kwargs): self.args = args self.kwargs = kwargs def identity (self): return self.args print(test1([1,2,3]).identity())
-> Hasil: ([1, 2, 3],)