Hai saya menggunakan data dari API yang keluar dalam format ini (mencakup sejumlah besar baris contoh yang diberikan hanya menunjukkan 2)

['347759', '98', '50752599'] 
['426291', '84', '3092962']

Setiap baris mewakili keterampilan yang berbeda dalam permainan, dan setiap bagian data di baris mewakili peringkat pemain dalam keterampilan itu, level mereka dalam keterampilan itu, dan total XP mereka dalam keterampilan itu misalnya jika keterampilan pertama menambang dan yang kedua keterampilan menempa data yang diformat adalah

Mining : rank=347759 , level = 98 , xp = 50752599

Smithing : rank=426291, level = 84, xp = 3092962

Saya menggunakan permintaan http untuk mengambil data ini dan mencakup banyak baris, saat ini saya menggunakan kode ini (lihat di bawah) untuk memisahkan data menjadi bilangan bulat terpisah pada setiap baris

line_count = 0
for line in data_processed:
    if line != '':
        skill_data = line.split(',')
        player.mining.rank = skill_data[0]
        player.mining.level = skill_data[1]
        player.mining.xp = skill_data[2]
        line_count = line_count + 1

Jelas masalah dengan ini adalah ketika pindah ke baris berikutnya dalam file ( trio kedua ints ) alih-alih player.mining.rank = skill_data[0] dll saya malah akan membutuhkan player.smithing.rank = skill_data[0] dan seterusnya untuk 24 baris yang berbeda (sebagai ada 24 keterampilan yang berbeda dalam permainan).

Bagaimana saya secara dinamis beralih dari menambahkan satu objek kelas seperti 'menambang' (Berasal dari kelas 'Keterampilan' dan dideklarasikan di bawah objek 'Pemain') ke objek kelas lain seperti 'menempa'

setiap saran diterima - Komentar jika Anda membutuhkan penjelasan atau konteks lebih lanjut - saya akan membalas dengan cepat

saya tahu saya bisa menggunakan ini (lihat di bawah) tetapi masalahnya adalah saya memiliki banyak pemain yang menelepon dari beberapa permintaan http sehingga akan menjangkau ratusan dan ratusan baris kode semuanya sangat mirip dengan hanya nama objek yang berbeda

if line_count == 1: player.mining.rank = skill_data[0] dan if line_count == 2: player.smithing.rank = skill_data[0]

class declarations

Untuk setiap pemain objeknya adalah nama karakter mereka misalnya Conial = Player(...)

0
m e m e 11 Juli 2020, 21:52

1 menjawab

Jawaban Terbaik

Anda dapat secara dinamis mendapatkan atribut berdasarkan string

Yang mengatakan, mari kita bayangkan Anda memiliki daftar keterampilan pemain sebagai string:

skills = ['mining', 'crafting', 'fishing', ... ]

Anda dapat mengubah kode Anda sedikit:

line_count = 0
for line in data_processed:
    if line != '':
        skill_data = line.split(',')
        playerSkill = getattr(player, skills[line_count])
        playerSkill.rank = skill_data[0]
        playerSkill.level = skill_data[1]
        playerSkill.xp = skill_data[2]
        
        line_count = line_count + 1
1
Codigo Morsa 11 Juli 2020, 19:22